diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java new file mode 100644 index 0000000..bdf3f2a --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface ISystemNoticeUserRelationService extends IService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java new file mode 100644 index 0000000..bdf3f2a --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface ISystemNoticeUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java new file mode 100644 index 0000000..b5867a9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java @@ -0,0 +1,38 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.model.system.SystemSign; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignService extends IService { + + Page listPage(Page page, SignListRequest request); + + ReturnDTO addSign(SignAddRequest request); + + ReturnDTO updateSign(SystemSign systemSign); + + ReturnDTO deleteSign(Long id); + + ReturnDTO deleteBatchSign(List ids); + + List usableSign(); + + List list(SignListRequest request); + + ReturnDTO signDetail(Long id); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java new file mode 100644 index 0000000..bdf3f2a --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface ISystemNoticeUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java new file mode 100644 index 0000000..b5867a9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java @@ -0,0 +1,38 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.model.system.SystemSign; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignService extends IService { + + Page listPage(Page page, SignListRequest request); + + ReturnDTO addSign(SignAddRequest request); + + ReturnDTO updateSign(SystemSign systemSign); + + ReturnDTO deleteSign(Long id); + + ReturnDTO deleteBatchSign(List ids); + + List usableSign(); + + List list(SignListRequest request); + + ReturnDTO signDetail(Long id); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java new file mode 100644 index 0000000..91aa01e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignUserRelationService extends IService { + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java new file mode 100644 index 0000000..bdf3f2a --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface ISystemNoticeUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java new file mode 100644 index 0000000..b5867a9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java @@ -0,0 +1,38 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.model.system.SystemSign; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignService extends IService { + + Page listPage(Page page, SignListRequest request); + + ReturnDTO addSign(SignAddRequest request); + + ReturnDTO updateSign(SystemSign systemSign); + + ReturnDTO deleteSign(Long id); + + ReturnDTO deleteBatchSign(List ids); + + List usableSign(); + + List list(SignListRequest request); + + ReturnDTO signDetail(Long id); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java new file mode 100644 index 0000000..91aa01e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java new file mode 100644 index 0000000..01d93bf --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.model.system.SystemTemplate; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemTemplateService extends IService { + + Page listPage(Page page, TemplateListRequest request); + + ReturnDTO addTemplate(TemplateAddRequest request); + + ReturnDTO updateTemplate(SystemTemplate systemTemplate); + + ReturnDTO deleteTemplate(Long id); + + ReturnDTO deleteBatchTemplate(List ids); + + List list(TemplateListRequest request); + + ReturnDTO templateDetail(Long id); +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..88d00cd --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -0,0 +1,97 @@ +package com.casic.missiles.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/24 17:57 + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + UPLOAD_FILE_NULL(3001, "上传文件不能为空"), + ID_NULL(2400, "主键不能为空"), + PROCESS_ID_NULL(2400, "流程实例id不能为空"), + DUPLICATE_NUMBER(2401, "编号生成重复,请重新提交"), + DUPLICATE_MANUFACTURE_NUMBER(2401, "出厂编号重复"), + PARAM_INVALID(2500, "参数不合法"), + LOGIN_USER_ACQUIRE_FAILED(2402, "无法获取登录者用户信息,请尝试重新登录再进行操作"), + + /** + * 设备与装置模块 + */ + EQUIPMENT_SAVE_FAILED(2402, "设备保存至草稿箱失败"), + EQUIPMENT_SUBMIT_FAILED(2403, "设备提交处理失败"), + EQUIPMENT_SAVE_REJECT(2404, "设备保存至草稿箱失败,该设备存在您发起的其他流程中"), + + APPROVAL_PROCESSOR_HANDLE_FAILED(500, "审批通过后处理失败"), + + + STANDARD_EQUIPMENT_ID_EXIST(2402, "标准装置不存在"), + STANDARD_EQUIPMENT_USER_ID_EXIST(2402, "标准装置-计量人员不存在"), + STANDARD_VERIFY_REGULATION_ID_EXIST(2402, "标准装置-检定规程不存在"), + STANDARD_SUPPORT_EQUIPMENT_ID_EXIST(2402, "标准装置-标准配套装置不存在"), + + TRACE_SUPPLIER_SAVE_FAILED(2404, "溯源供方保存至草稿箱失败"), + TRACE_SUPPLIER_SUBMIT_FAILED(2405, "溯源供方提交处理失败"), + FILE_SUBMIT_FAILED(2407, "文件提交处理失败"), + FLOW_NO_JOIN_FLOWABLE(2408, "该流程暂未接入Flowable,请重试"), + HANDLE_FAILED(500, "操作失败"), + NO_PROPERLY_CONNECTED(500, "请正确连接扫码设备"), + QRCODE_FAILED(2409, "二维码生成失败"), + RECEIVE_SAMPLE_NOT_EXIST(2410, "待检测中不存在扫描收入的样品"), + COMPLETE_SAMPLE_NOT_EXIST(2411, "检测中不存在扫描收入的样品"), + CANNOT_CHANGE_MEASURE_INFO(2412, "无法更改非当前登录用户的检测信息"), + NON_EXIST_ORDER_OR_SAMPLE(2413, "不存在该委托单或该委托单下的样品"), + AGAIN_PRINT_SUBMIT_FAILED(2414, "再次打印提交处理失败"), + LOGIN_USER_NOT_STAFF(2415, "登录用户非计量人员"), + CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), + SITE_EXECUTIVE__SUBMIT_FAILED(3402, "现场检测审核提交处理失败"), + + FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请正确连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"), + + OUTSOURCER_SAVE_FAILED(2419, "分包方保存至草稿箱失败"), + OUTSOURCER_SUBMIT_FAILED(2420, "分包方提交处理失败"), + OUTSOURCE_PROJECT_APPLY_SAVE_FAILED(2421, "分包项目申请保存至草稿箱失败"), + OUTSOURCE_PROJECT_APPLY_SUBMIT_FAILED(2422, "分包项目申请提交处理失败"), + OUTSOURCE_PROJECT_CHECK_SAVE_FAILED(2423, "分包项目验收保存至草稿箱失败"), + OUTSOURCE_PROJECT_CHECK_SUBMIT_FAILED(2424, "分包项目验收提交处理失败"), + + AGREEMENT_SAVE_FAILED(2425, "合同保存至草稿箱失败"), + AGREEMENT_APPLY_SUBMIT_FAILED(2426, "合同提交处理失败"), + + OUTSOURCE_CERTIFICATE_NO_FILES(2427, "无导入数据Excel文件或无证书文件或证书文件格式有误"), + OUTSOURCE_CERTIFICATE_NO_DATA(2428, "Excel文件无数据"), + OUTSOURCE_CERTIFICATE_NO_DATA_ITEM(2429, "Excel文件中缺少必要数据项数据"), + OUTSOURCE_CERTIFICATE_INCORRECT_DATA_ITEM(2430, "Excel文件中检测单位编号或样品编号或证书附件不正确"), + UNABLE_TO_URGE(2431, "该部门不存在负责人,无法催办"), + USER_ID_EMPTY(2432, "用户id不能为空"), + CLIENT_ID_EMPTY(2433, "用户id不能为空"), + URGER_IS_EMPTY(2434, "催办人不存在或被删除,无法催办"); + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java new file mode 100644 index 0000000..afd6e93 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/CacheKeys.java @@ -0,0 +1,12 @@ +package com.casic.missiles.enums; + +/** + * @Description: Redis key + * @Author: wangpeng + * @Date: 2022/8/8 10:26 + */ +public interface CacheKeys { + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; + + String SMS_TIMEOUT = "missiles:metering:sms:timeout:{0}"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java new file mode 100644 index 0000000..e05c3d8 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ExportEnum.java @@ -0,0 +1,85 @@ +package com.casic.missiles.enums; + +/** + * @Description: 导出模板枚举 + * @Author: wangpeng + * @Date: 2022/12/2 11:53 + */ +public enum ExportEnum { + FILE_EXPORT("meterFileData", "meterFileData", "计量文件信息"), + TRAIN_PLAN_EXPORT("trainPlanData", "trainPlanData", "培训计划"), + TRAIN_LOG_EXPORT("trainLogData", "trainLogData", "培训记录"), + METER_ORGANIZE_EXPORT("meterOrganizeData", "meterOrganizeData", "计量组织"), + TRACE_SUPPLIER_EXPORT("traceSupplierData", "traceSupplierData", "溯源供方"), + SIGN_EXPORT("signData", "signData", "签名/签章"), + TEMPLATE_EXPORT("templateData", "templateData", "原始记录模板/证书报告模板"), + FIXED_ASSETS("meterFixedAssets", "meterFixedAssets", "固定资产"), + METER_EQUIPMENT("meterEquipment", "meterEquipment", "测量设备"), + CALIBRATION_TEST_EQUIPMENT("calibrationTestEquipment", "calibrationTestEquipment", "校准检定设备"), + MEASURE_ACCOUNT("measureAccount", "measureAccount", "测量工装"), + STANDARD_SUPPORT_EQUIPMENT("standardSupportEquipment", "standardSupportEquipment", "标准配套设备"), + STANDARD_EQUIPMENT("standardEquipment", "standardEquipment", "标准装置"), + FLOW_DEF_EXPORT("flowDefData", "flowDefData", "流程定义"), + STAFF_CERTIFICATE("certificate", "certificate", "计量人员证书"), + CHECK_INFO("checkInfo", "checkInfo", "设备管理点检测"), + EQUIPMENT_APPLY("equipmentApply", "equipmentApply", "设备借用"), + STANDARD_EQUIPMENT_REMIND("equipmentApplyRemind", "equipmentApplyRemind", "标准装置到期提醒"), + METER_PRICE("meterPrice", "meterPrice", "价格库"), + METER_STAFF("meterStaff", "meterStaff", "计量人员"), + STANDARD_EQUIPMENT_APPLY("standardEquipmentApply", "standardEquipmentApply", "标准装置申请"), + STATE_MANAGE_APPLY("stateManage", "stateManage", "状态管理"), + METER_ACCEPTANCE_CHECK("acceptanceCheck", "acceptanceCheck", "设备检修保养验收单"), + CUSTOMER_EXPORT("customerData", "customerData", "客户信息"), + ORDER_EXPORT("orderData", "orderData", "委托书信息"), + SAMPLE_EXPORT("sampleData", "sampleData", "样本信息"), + EXCHANGE_DATA("exchangeData", "exchangeData", "设备交接单"), + DISPATCH_DATA("dispatchData", "dispatchData", "设备收发"), + ENVIRONMENT_DATA("environmentData", "environmentData", "环境记录单"), + ORIGIN_DATA("originData", "originData", "原始记录"), + CERTIFICATE_REPORT("certificateReport", "certificateReport", "证书报告"), + ADVICE_EXPORT("adviceData", "adviceData", "客户反馈"), + HANDOUT_EXPORT("handoutData", "handoutData", "任务分发列表"), + OUTSOURCER_EXPORT("outsourcerData", "outsourcerData", "分包方"), + CERTIFICATE_PRINT_EXPORT("certificatePrintData", "certificatePrintData", "证书打印"), + DOWNLOAD_TEMPLATE("downloadTemplate", "downloadTemplate", "页面配置"), + OUTSOURCER_CERTIFICATE_EXPORT("outsourceCertificateData", "outsourceCertificateData", "分包证书"), + SETTLEMENT_INFO_EXPORT("settlementInfoData", "settlementInfoData", "业务结算"), + EQUIPMENT_REMIND("equipmentRemind", "equipmentRemind", "设备到期提醒"), + AGREEMENT_INFO_EXPORT("agreementInfoData", "agreementInfoData", "合同"), + WORK_STATISTICS_EXPORT("workStatisticsData", "workStatisticsData", "实时工作统计"), + DEPT_OUTPUT_EXPORT("deptOutputData", "deptOutputData", "部门产值分析"), + WORKLOAD_EXPORT("workloadData", "workloadData", "业务工作量分析"), + DEPT_COMPREHENSIVE_EXPORT("deptComprehensiveData", "deptComprehensiveData", "部门综合分析"), + ENVIRONMENTAL_RECORD("environmentalRecordData", "environmentalRecordData", "现场环境记录"); + + ExportEnum(String fileName, String sheetName, String description) { + this.fileName = fileName; + this.sheetName = sheetName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileName; + /** + * 下载文件名 + */ + private String sheetName; + /** + * 描述信息 + */ + private String description; + + public String getFileName() { + return fileName; + } + + public String getSheetName() { + return sheetName; + } + + public String getDescription() { + return description; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java new file mode 100644 index 0000000..a46857c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/equipment/EquipmentTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.equipment; + +public interface EquipmentTypeEnum { + + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_NORMAL = "1"; + /** + * 设备类型:受检设备 + */ + String EQUIPMENT_TYPE_SPECIAL = "2"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java new file mode 100644 index 0000000..03b8b0c --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/ActionStatusBeanEnum.java @@ -0,0 +1,26 @@ +package com.casic.missiles.enums.notifyevent; + +/** + * 这里定义bean的信息 + */ +public interface ActionStatusBeanEnum { + + String EQUIPMENT_BEAN_NAME = "equipmentBean"; + +// String SUPPORT_BEAN_NAME = "equipmentSupportBean"; +// +// String MANAGING_BEAN_NAME = "equipmentManagingBean"; +// +// String CERTIFICATE_BEAN_NAME = "certificatePrintBean"; +// +// String LEASE_BEAN_NAME = "equipmentLeaseBean"; +// +// String CERTIFICATE_REPORT_BEAN_NAME = "certificateReportBean"; +// +// String OUTSOURCE_PROJECT_APPLY_BEAN_NAME = "outsourceProjectApplyBean"; +// +// String OUTSOURCE_PROJECT_CHECK_BEAN_NAME = "outsourceProjectCheckBean"; +// +// String SITE_EXECUTIVE_INFO_BEAN_NAME = "siteExecuteInfoBean"; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java new file mode 100644 index 0000000..122c83e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareActionStatusEnum.java @@ -0,0 +1,74 @@ +package com.casic.missiles.enums.notifyevent; + +import com.casic.missiles.enums.system.ApplyFromIdEnum; + +import java.util.HashMap; + +public enum AwareActionStatusEnum implements ActionStatusBeanEnum { + EQUIPMENT_APPROVAL(EQUIPMENT_BEAN_NAME, ""), + +// EQUIPMENT_APPLY_STOP(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.STOP), +// EQUIPMENT_APPLY_REVOKE(APPLY_BEAN_NAME, EquipmentApplyProcessEnum.REVOKE), +// EQUIPMENT_SUPPORT_STATUS(SUPPORT_BEAN_NAME, ""), +// DEVICE_MANAGING_IDLE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.IDLE), +// DEVICE_MANAGING_SEALED(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SEALED), +// DEVICE_MANAGING_USE(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.USE), +// DEVICE_MANAGING_SCRAP(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.SCRAP), +// DEVICE_MANAGING_MANAGEMENT(MANAGING_BEAN_NAME, EquipmentApplyProcessEnum.MANAGEMENT), +// DEVICE_LEASE_CONSUMING(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_COLLECTING), +// DEVICE_LEASE_BORROWED(LEASE_BEAN_NAME, EquipmentApplyProcessEnum.WAIT_BORROWED), +// CERTIFICATE_PRINT_STATUS(CERTIFICATE_BEAN_NAME, ""), +// CERTIFICATE_REPORT_STATUS(CERTIFICATE_REPORT_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_APPLY(OUTSOURCE_PROJECT_APPLY_BEAN_NAME, ""), +// OUTSOURCE_PROJECT_CHECK(OUTSOURCE_PROJECT_CHECK_BEAN_NAME, ""), +// SITE_EXECUTIVE_INFO_CHECK(SITE_EXECUTIVE_INFO_BEAN_NAME, ""), + ACTION_STATUS_MAP(new HashMap() { + { + //设备台账 + put(ApplyFromIdEnum.EQUIPMENT_APPROVAL.getCode(), EQUIPMENT_APPROVAL); + +// put(ApplyFromIdEnum.STANDARD_REVERT_APPROVAL.getCode(), EQUIPMENT_APPLY_USE); +// put(ApplyFromIdEnum.STANDARD_PAUSE_APPROVAL.getCode(), EQUIPMENT_APPLY_STOP); +// put(ApplyFromIdEnum.STANDARD_RESUME_APPROVAL.getCode(), EQUIPMENT_APPLY_REVOKE); +// put(ApplyFromIdEnum.STANDARD_CHANGE_APPROVAL.getCode(), EQUIPMENT_SUPPORT_STATUS); +// put(ApplyFromIdEnum.DEVICE_UNUSED_APPROVAL.getCode(), DEVICE_MANAGING_IDLE); +// put(ApplyFromIdEnum.DEVICE_SEALED_APPROVAL.getCode(), DEVICE_MANAGING_SEALED); +// put(ApplyFromIdEnum.DEVICE_UNSEALED_APPROVAL.getCode(), DEVICE_MANAGING_USE); +// put(ApplyFromIdEnum.DEVICE_SCRAP_APPROVAL.getCode(), DEVICE_MANAGING_SCRAP); +// put(ApplyFromIdEnum.DEVICE_HANDLE_APPROVAL.getCode(), DEVICE_MANAGING_MANAGEMENT); +// put(ApplyFromIdEnum.DEVICE_CONSUMING_APPROVAL.getCode(), DEVICE_LEASE_CONSUMING); // 设备领用申请 +// put(ApplyFromIdEnum.DEVICE_BORROW_APPROVAL.getCode(), DEVICE_LEASE_BORROWED); // 设备借用申请 +// put(ApplyFromIdEnum.CERTIFICATE_PRINT_APPROVAL.getCode(), CERTIFICATE_PRINT_STATUS); //证书打印审批通过状态回填 +// put(ApplyFromIdEnum.CERTIFICATE_REPORT_APPROVAL.getCode(), CERTIFICATE_REPORT_STATUS); //证书报告审批通过状态回填 +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_APPLY_APPROVAL.getCode(), OUTSOURCE_PROJECT_APPLY); +// put(ApplyFromIdEnum.OUTSOURCE_PROJECT_CHECK_APPROVAL.getCode(), OUTSOURCE_PROJECT_CHECK); +// put(ApplyFromIdEnum.SITE_EXECUTIVE_INFO_APPROVAL.getCode(), SITE_EXECUTIVE_INFO_CHECK); //外场检测审批 + } + }); + String actionBeanName; + String status; + + AwareActionStatusEnum(String actionBeanName, String status) { + this.actionBeanName = actionBeanName; + this.status = status; + } + + public String getActionBeanName() { + return actionBeanName; + } + + public String getStatus() { + return status; + } + + public HashMap actionStatusMap; + + AwareActionStatusEnum(HashMap actionStatusMap) { + this.actionStatusMap = actionStatusMap; + } + + public HashMap getActionStatusMap() { + return actionStatusMap; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java new file mode 100644 index 0000000..79a9c26 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -0,0 +1,52 @@ +package com.casic.missiles.enums.system; + +public enum ApplyFromIdEnum { + /** + * 设备与装置 + */ + EQUIPMENT_APPROVAL("sbyzzsbtzsp", "2", "设备台账审批"), + + STANDARD_CHANGE_APPROVAL("sbglbzzzghsq", "3", "标准装置更换申请"), + STANDARD_PAUSE_APPROVAL("sbglbzzzztsq", "3", "标准装置暂停申请"), + STANDARD_REVERT_APPROVAL("sbglbzzzcxsq", "3", "标准装置撤销申请"), + STANDARD_RESUME_APPROVAL("sbglbzzzhfsq", "3", "标准装置恢复申请"), + STANDARD_CHECK_APPROVAL("sbglbzzzfcsq", "3", "标准装置复查申请"), + DEVICE_UNUSED_APPROVAL("sbglsbxzsq", "3", "设备闲置申请"), + DEVICE_SEALED_APPROVAL("sbglsbfcsq", "3", "设备封存申请"), + DEVICE_UNSEALED_APPROVAL("sbglsbqfsq", "3", "设备启封申请"), + DEVICE_SCRAP_APPROVAL("sbglsbbfsq", "3", "设备报废申请"), + DEVICE_HANDLE_APPROVAL("sbglsbczsq", "3", "设备处置申请"), + DEVICE_CONSUMING_APPROVAL("clsblysp", "3", "设备领用申请"), + DEVICE_BORROW_APPROVAL("clsbjysp", "3", "设备借用申请"), + DEVICE_FIX_APPROVAL("sbglsbjxsq", "3", "设备检修申请"), + DEVICE_FIX_ACCEPTANCE("sbglsbjxbyysd", "3", "设备检修保养验收单"), + CERTIFICATE_PRINT_APPROVAL("ywglzsdy", "1", "证书打印通过"), + CERTIFICATE_REPORT_APPROVAL("ywglzsbg", "1", "证书报告通过"), + OUTSOURCER_APPROVAL("ywglfbfzg", "1", "分包方资格"), + OUTSOURCE_PROJECT_APPLY_APPROVAL("ywglfbxmsq", "1", "分包项目申请"), + OUTSOURCE_PROJECT_CHECK_APPROVAL("ywglfbxmys", "1", "分包项目验收"), + AGREEMENT_APPROVAL("cwczht", "2", "合同"), + SITE_EXECUTIVE_INFO_APPROVAL("ywglxcjc", "1", "现场检测审批"); + + private String code; + private String source;//MessageSourceModuleEnum类code,工作台审批消息提醒接口使用 + private String value; + + ApplyFromIdEnum(String code, String source, String value) { + this.code = code; + this.source = source; + this.value = value; + } + + public String getCode() { + return code; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java new file mode 100644 index 0000000..444dbb9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApprovalStatusEnum.java @@ -0,0 +1,30 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 审批状态类型枚举 + * @Author: wangpeng + * @Date: 2022/12/15 10:51 + */ +public interface ApprovalStatusEnum { + String PROCESS_STATUS = "processStatus"; + //全部 + String ALL = "0"; + //草稿箱 + String DRAFT = "1"; + //待审批 + String TO_BE_APPROVED = "2"; + //审批中,驳回后编辑会设置该状态到flowable + String IN_APPROVED = "3"; + //已通过,会设置到flowable(listener) + String PASSED = "4"; + //未通过,会设置到flowable + String FAILED = "5"; + //未通过-驳回,会设置到flowable + String FAILED_REJECT = "8"; + //已取消,会设置到flowable + String CANCELED = "6"; + //非草稿状态,仅在枚举中设置,字典中不设置 + String UN_DRAFT = "7"; + //删除,已取消中提交后的原有实例删除,仅在枚举中设置,字典中不设置 + String DELETED = "8"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java new file mode 100644 index 0000000..10a034b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeSetTypeEnum.java @@ -0,0 +1,16 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/27 16:00 + */ +public interface AssigneeSetTypeEnum { + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 + Integer ASSIGN_USER = 1; + Integer LEADER = 2; + Integer SELF_SELECT = 4; + Integer SELF = 5; + Integer LEADER_TOP = 7; + Integer ROLE = 11; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java new file mode 100644 index 0000000..a6bbe6f --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/AssigneeTypeEnum.java @@ -0,0 +1,13 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/02/09 16:00 + */ +public interface AssigneeTypeEnum { + //1具体人员 2角色 3部门 + String USER = "1"; + String ROLE = "2"; + String DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java new file mode 100644 index 0000000..1ab70c0 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/DeptTypeEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.enums.system; + +/** + * @Description: 部门类型字典值 + * @Author: wangpeng + * @Date: 2023/7/20 18:00 + */ +public interface DeptTypeEnum { + //管理部门 + String MANAGE_DEPT = "1"; + //业务部门 + String BIS_DEPT = "2"; + //检定部门 + String MEASURE_DEPT = "3"; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java new file mode 100644 index 0000000..c770ac1 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/NotifyEventPostProcessor.java @@ -0,0 +1,13 @@ +package com.casic.missiles.listeners; + +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; + +/** + * @author cz + * 工作流监听后置事件 + */ +public interface NotifyEventPostProcessor { + + void doHandleNotifyEvent(NotifyEventStatusDTO notifyEventStatusDTO); + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java new file mode 100644 index 0000000..097a336 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -0,0 +1,240 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.enums.system.AssigneeSetTypeEnum; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.RuRelationMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 会签监听器 + * 在流程的执行过程中遇到业务逻辑无法用常规进行的业务的时候可以借助流程监听来实现业务功能 + * 一般来说,我们在事件和网关上使用ExecutionListener,在UserTask上使用TaskListener + * ExecutionListener触发时机(start开始、take启用、end结束)(在代码相应位置设置该监听器): + * 流程实例的启动和结束。 + * 选中一条连线。 + * 节点的开始和结束。 + * 网关的开始和结束。 + * 中间事件的开始和结束。 + * 开始事件结束或结束事件开始。 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class CounterSignListener implements ExecutionListener { + @Resource + private RepositoryService repositoryService; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RuRelationMapper ruRelationMapper; + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + //每个任务节点的开始就会执行,在userTask中设置该监听器,保证审批人设置成功 + @Override + public void notify(DelegateExecution execution) { + //设置当前任务节点的任务办理人 + //当前节点id,在任务中为任务id + String taskId = execution.getCurrentActivityId(); + String variable = taskId + "assigneeList"; + //当前任务审批人信息 + List usersValue = (List) execution.getVariable(variable); + String processDefinitionId = execution.getProcessDefinitionId(); + List assigneeList = new ArrayList<>(); + if (CollectionUtils.isEmpty(usersValue)) { + //获取当前任务所在节点的审批人列表,vue3每个节点的id是通过id("xxx")方法生成的,vue2中前端传id字段 + //根据任务id获取到任务节点的审批人(已经在生成id之后设置到json) + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject nodeConfig = jsonObject.getJSONObject("nodeConfig"); + JSONObject nodeUserJsonObject = getNodeUserList(nodeConfig, taskId); + if (Objects.isNull(nodeUserJsonObject)) { + log.error("监听器查找审批人失败,该任务不存在,flowDef json:{}", systemFlowForm.getFlowDef()); + return; + } + + Integer settype = nodeUserJsonObject.getInteger("settype"); + if(!Objects.isNull(settype)){ + //根据节点不同审批人类型分别进行处理 + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { + JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); + //所选审批人分类 + Iterator iterator = nodeUserArray.stream().iterator(); + while (iterator.hasNext()) { + JSONObject jsonObject1 = (JSONObject) iterator.next(); + String targetId = jsonObject1.getString("targetId"); + //1具体人员 2角色 3部门 + if (AssigneeTypeEnum.USER.equals(jsonObject1.getString("type"))) { + assigneeList.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(jsonObject1.getString("type"))) { + //按角色查询用户id + QueryWrapper ruWrapper = new QueryWrapper<>(); + ruWrapper.eq("ROLEID", targetId); + List ruRelations = ruRelationMapper.selectList(ruWrapper); + if (!CollectionUtils.isEmpty(ruRelations)) { + List collect = ruRelations.stream().map(RuRelation::getUserId).map(x -> x + "").collect(Collectors.toList()); + assigneeList.addAll(collect); + } + } else if (AssigneeTypeEnum.DEPT.equals(jsonObject1.getString("type"))) { + //按部门查询用户id + List> list = userMapper.selectUsers(null, null, null, targetId); + if (!CollectionUtils.isEmpty(list)) { + list.stream().forEach(m -> { + String id = String.valueOf(m.get("id")); + assigneeList.add(id); + }); + } + } + } + } else if (AssigneeSetTypeEnum.LEADER == settype) { + // 选择主管作为审批人 + String startUserId = execution.getVariable("root", String.class); + User user = userMapper.selectById(startUserId); + //根据发起人查部门,根据部门查主管角色查主管,每个部门只有一个主管,根据角色和部门获取主管 + //sys_role表tips字段区分角色,director定义为主管角色 + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE sr.DEPT_ID = {0}" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {0}", String.valueOf(user.getDeptId()), "director"); + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + } else if (AssigneeSetTypeEnum.SELF_SELECT == settype) { + // TODO: 2022/12/27 发起人自选审批人(需求暂无此功能) + + } else if (AssigneeSetTypeEnum.SELF == settype) { + //启动流程时设置的发起人全局变量 + String startUserId = execution.getVariable("root", String.class); + assigneeList.add(startUserId); + } else if (AssigneeSetTypeEnum.LEADER_TOP == settype) { + //连续多级主管作为审批人,审批方式由多人审批时审批方式字段决定 + //根据发起人查部门,根据部门查主管角色,根据发起人部门查父部门,根据父部门查主管角色,递归 + + //多实例加签,解决手动加签的情况,这里是还未设置审批人,无需采用多实例加签的功能,增加到assigneeList即可 + //runtimeService.addMultiInstanceExecution(); + + String startUserId = execution.getVariable("root", String.class); + + //循环查询发起人的主管id + //directorLevel一定大于1,前端做下拉限制从2级起 + Integer directorLevel = nodeConfig.getInteger("directorLevel"); + for (int i = 1; i <= directorLevel; i++) { + User user = userMapper.selectById(startUserId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(i > 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" + + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + if(CollectionUtils.isEmpty(list)){ + break; + } + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + assigneeList.add(id); + startUserId = id; + } + // TODO: 2023/1/13 以上逻辑需联调测试验证 + } + } + + //无审批人时,根据参数(noHanderAction)判断自动驳回or自动通过 + if (CollectionUtils.isEmpty(assigneeList)) { + //1自动审批通过 2自动审批拒绝 3转交给审核管理员 + Integer noHanderAction = nodeUserJsonObject.getInteger("noHanderAction"); + if (1 == noHanderAction) { + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (2 == noHanderAction) { + execution.setVariable("autoRefuse", Boolean.TRUE); + assigneeList.add("100000"); + execution.setVariable(variable, assigneeList); + } else if (3 == noHanderAction) { + assigneeList.add("0"); + execution.setVariable(variable, assigneeList); + } else { + log.error("监听器获取审批人失败,请检查流程审批人配置,flowDef json:{}", systemFlowForm.getFlowDef()); + } + } else { + execution.setVariable(variable, assigneeList); + } + } + } + + /** + * 递归获取匹配taskId的节点 + * @param nodeConfig + * @param taskId + * @return + */ + private JSONObject getNodeUserList(JSONObject nodeConfig, String taskId) { + JSONObject childNode = nodeConfig.getJSONObject("childNode"); + if (!Objects.isNull(childNode) && StringUtils.isNotEmpty(childNode.getString("id")) && taskId.equals(childNode.getString("id"))) { + return childNode; + } + if (!Objects.isNull(childNode) && Objects.isNull(childNode.getJSONArray("conditionNodes"))) { + return getNodeUserList(childNode, taskId); + }else if(!Objects.isNull(childNode) && !Objects.isNull(childNode.getJSONArray("conditionNodes"))){ + //条件节点判断 + JSONArray conditionNodes = childNode.getJSONArray("conditionNodes"); + for (Object conditionNode : conditionNodes) { + JSONObject node = (JSONObject)conditionNode; + if(Objects.isNull(getNodeUserList(node, taskId))){ + continue; + } + //条件节点一定能匹配到任务审批人 + return getNodeUserList(node, taskId); + } + } + return null; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java new file mode 100644 index 0000000..5fd4def --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/ProcessUpdateStateListener.java @@ -0,0 +1,86 @@ +package com.casic.missiles.listeners.flowable; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; +import com.casic.missiles.enums.notifyevent.AwareActionStatusEnum; +import com.casic.missiles.enums.system.ApprovalStatusEnum; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.listeners.NotifyEventPostProcessor; +import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Component +public class ProcessUpdateStateListener implements ExecutionListener { + + @Override + @Transactional + public void notify(DelegateExecution execution) { + RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); + System.err.println("审批通过触发监听器:" + execution); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("pro_def_id", processDefinition.getKey()); + // 查出流程定义信息 + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + String id = execution.getProcessInstanceBusinessKey(); + AwareActionStatusEnum notifyActionStatusEnum = AwareActionStatusEnum.ACTION_STATUS_MAP.getActionStatusMap().get(systemFlowForm.getFormId()); + if (null != notifyActionStatusEnum) { + NotifyEventStatusDTO notifyEventStatusDTO = NotifyEventStatusDTO.builder() + .id(id) + .status(notifyActionStatusEnum.getStatus()).build(); + NotifyEventPostProcessor postProcessor = SpringContextUtil.getBean(notifyActionStatusEnum.getActionBeanName()); + if (null != postProcessor) { + postProcessor.doHandleNotifyEvent(notifyEventStatusDTO); + } + } + //设置通过状态为已通过 + runtimeService.updateBusinessStatus(execution.getProcessInstanceId(), ApprovalStatusEnum.PASSED); + //审批通过,通知发起人 +// sendMessageAndSocket(execution, systemFlowForm); + } + + private void sendMessageAndSocket(DelegateExecution execution, SystemFlowForm systemFlowForm) { + JSONObject jsonObject = JSONObject.parseObject(systemFlowForm.getFlowDef()); + JSONObject workFlowDef = jsonObject.getJSONObject("workFlowDef"); + Integer noticeStarter = workFlowDef.getInteger("noticeStarter"); + if (!Objects.isNull(noticeStarter) && 1 == noticeStarter) { + Long rootId = Long.valueOf(String.valueOf(execution.getVariable("root"))); + String formName = jsonObject.getString("formName"); + String formId = systemFlowForm.getFormId(); + //总工作台中需要展示所有业务的用户待审批的列表(查询每个业务的待审批进行组合) + //每个业务和前端定一个type(用formId即可,前提要保证流程定义和formId为一对一关系),用于前端页面跳转 +// WorkbenchApprovalMessageMapper approvalMessageMapper = SpringContextUtil.getBean(WorkbenchApprovalMessageMapper.class); +// UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); +// User user = userMapper.selectById(rootId); +// WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); +// approvalMessage.setNoticeId(rootId); +// approvalMessage.setNoticeDeptId(user.getDeptId()); +// approvalMessage.setMessageTitle("结果通知"); +// approvalMessage.setMessageContent(formName); +// approvalMessage.setFormId(formId); +// approvalMessage.setCreateTime(DateUtil.now()); +// if (approvalMessageMapper.insert(approvalMessage) < 0) { +// log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); +// }else { +// //websocket消息推送 +// WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); +// webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); +// } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java new file mode 100644 index 0000000..04154f2 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -0,0 +1,77 @@ +package com.casic.missiles.listeners.flowable; + + +import com.casic.missiles.enums.CacheKeys; +import com.casic.missiles.utils.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Objects; + + +/** + * @Description: 流程监听器,作用:动态设置任务办理人(支持发起人自选等) + * TaskListener触发时机(在代码相应位置设置该监听器): + * create:在任务创建且所有任务属性设置完成之后才触发。 + * assignment:在任务被分配给某个办理人之后触发,它是在create事件触发前被触发。 + * complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。 + * delete:任务删除触发 + * @Author: wangpeng + * @Date: 2022/12/27 9:54 + */ +@Slf4j +@Component +public class TaskCreatedListener implements TaskListener { + @Resource + private TaskService taskService; + @Resource + private RuntimeService runtimeService; + @Resource + private HistoryService historyService; + @Resource + private RedisUtil redisUtil; + + //每个任务创建完成后就会执行,在userTask和根节点设置该监听器,保证根节点任务(发起人)和用户空任务完成 + @Override + public void notify(DelegateTask delegateTask) { + //审批人为空,任务自动通过/自动驳回执行 + //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); + String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { + taskService.complete(delegateTask.getId()); + //保证流程驳回到发起人后不自动审批通过 + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); + } else { + if ("100000".equals(delegateTask.getAssignee())) { + Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 + if (null == autoRefuse) { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动通过"); + taskService.complete(delegateTask.getId()); + } else { + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), "opinion", "审批人为空,自动驳回"); + //获取发起人任务节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc().list().get(0); + //驳回至发起人 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(delegateTask.getProcessInstanceId()) + .moveActivityIdTo(delegateTask.getTaskDefinitionKey(), historicTaskInstance.getTaskDefinitionKey()) + .changeState(); +// runtimeService.deleteProcessInstance(delegateTask.getProcessInstanceId(), "审批人为空,自动驳回"); + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java new file mode 100644 index 0000000..a75b8ad --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ConvertUtils.java @@ -0,0 +1,59 @@ +package com.casic.missiles.utils; + +import cn.hutool.core.bean.BeanUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @Description: 工具类-转换pojo或list + * @Author: wangpeng + * @Date: 2022/11/26 14:01 + */ +public class ConvertUtils { + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public ConvertUtils() { + } + + public static T sourceToTarget(Object source, Class target) { + if (source == null) { + return null; + } else { + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + } catch (Exception var4) { + logger.error("convert error ", var4); + } + + return targetObject; + } + } + + public static List sourceToTarget(Collection sourceList, Class target) { + if (sourceList == null) { + return null; + } else { + ArrayList targetList = new ArrayList(sourceList.size()); + try { + Iterator var3 = sourceList.iterator(); + while(var3.hasNext()) { + Object source = var3.next(); + T targetObject = target.newInstance(); + BeanUtil.copyProperties(source, targetObject); + targetList.add(targetObject); + } + } catch (Exception var6) { + logger.error("convert error ", var6); + } + + return targetList; + } + } +} \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java new file mode 100644 index 0000000..01ff4e9 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/PdfUtil.java @@ -0,0 +1,176 @@ +package com.casic.missiles.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Map; + +/** + * @Description: 根据word模板导出文件 + * @Author: zt + * @Date: 2023/2/2 9:27 + */ +public class PdfUtil { + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + os = new FileOutputStream(pdfPath); + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + is.close();//关闭输入流 + os.close();//关闭输出流 + return ""; + } catch (Exception e) { + //e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + public static void downloadFile(HttpServletResponse response, String downloadFilePath, String fileName) throws UnsupportedEncodingException { + File file = new File(downloadFilePath); + if (file.exists()) { + response.setContentType("application/force-download");// 设置强制下载不打开 +// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + //中文名称下载 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + //e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + } + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java new file mode 100644 index 0000000..d314153 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/RedisUtil.java @@ -0,0 +1,319 @@ +package com.casic.missiles.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Redis调用工具类 + * @Author: wangpeng + * @Date: 2022/8/8 10:15 + */ +@Component +public class RedisUtil { + @Autowired + private RedisTemplate redisTemplate; + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java new file mode 100644 index 0000000..2454a5e --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/SnowflakeUtil.java @@ -0,0 +1,161 @@ +package com.casic.missiles.utils; + +import org.springframework.stereotype.Component; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +/** + *

描述:分布式自增长ID

+ *
+ *     Twitter的 Snowflake JAVA实现方案
+ * 
+ * 用一个0表示一位,用—分割开部分的作用: + * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 + * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, + * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), + * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 + * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), + * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 + *

+ * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) + */ +@Component +public class SnowflakeUtil { + // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) + private final static long twepoch = 1288834974657L; + // 机器标识位数 + private final static long workerIdBits = 5L; + // 数据中心标识位数 + private final static long datacenterIdBits = 5L; + // 机器ID最大值 + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 数据中心ID最大值 + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 毫秒内自增位 + private final static long sequenceBits = 12L; + // 机器ID偏左移12位 + private final static long workerIdShift = sequenceBits; + // 数据中心ID左移17位 + private final static long datacenterIdShift = sequenceBits + workerIdBits; + // 时间毫秒左移22位 + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + /* 上次生产id时间戳 */ + private static long lastTimestamp = -1L; + // 0,并发控制 + private long sequence = 0L; + + private final long workerId; + // 数据标识id部分 + private final long datacenterId; + + public SnowflakeUtil() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + /** + * @param workerId 工作机器ID + * @param datacenterId 序列号 + */ + public SnowflakeUtil(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获取下一个ID + * + * @return + */ + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 当前毫秒内,则+1 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + // 当前毫秒内计数满了,则等待下一秒 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + // ID偏移组合生成最终的ID,并返回ID + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + /** + *

+ * 获取 maxWorkerId + *

+ */ + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + /* + * MAC + PID 的 hashcode 获取16个低位 + */ + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + /** + *

+ * 数据标识id部分 + *

+ */ + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java new file mode 100644 index 0000000..9dcc3a7 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupInfoMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-设备分组信息表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupInfoMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java new file mode 100644 index 0000000..52b8d7a --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentGroupRelationMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentGroupRelationMapper extends BaseMapper { + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java new file mode 100644 index 0000000..dd93f9e --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/equipment/EquipmentSpecialCertificateMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 受检设备-特种设备证书表 Mapper 接口 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface EquipmentSpecialCertificateMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java new file mode 100644 index 0000000..5494aca --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:19 + */ +public interface FlowDefMapper { + List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); + + List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java new file mode 100644 index 0000000..403b507 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFileConfigMapper.java @@ -0,0 +1,24 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.model.system.SystemFileConfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface SystemFileConfigMapper extends BaseMapper { + + Long selectMaxFileNo(); + + Long selectMaxVersionNo(); + + String getFileNameByBusiness(@Param("request") DownloadFileRequest downloadFileRequest); + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java new file mode 100644 index 0000000..ba7dfe1 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemFlowFormMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface SystemFlowFormMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java new file mode 100644 index 0000000..1372bfc --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.model.system.SystemNotice; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 系统管理-通知公告表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface SystemNoticeMapper extends BaseMapper { + Long selectMaxNoticeNo(); + + Page selectListPage(Page page, @Param("request") NoticeListRequest request); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java new file mode 100644 index 0000000..bb54311 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemNoticeUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface SystemNoticeUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java new file mode 100644 index 0000000..98079db --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignMapper.java @@ -0,0 +1,25 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.model.system.SystemSign; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignMapper extends BaseMapper { + + Long selectMaxSignNo(); + + SignDetailResponse selectSignDetailById(Long id); + + List selectUsableSignList(@Param("userId") Long userId); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java new file mode 100644 index 0000000..5c68004 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemSignUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemSignUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java new file mode 100644 index 0000000..3a31683 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateMapper.java @@ -0,0 +1,20 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.model.system.SystemTemplate; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateMapper extends BaseMapper { + + Long selectMaxTemplateNo(); + + TemplateDetailResponse selectTemplateDetailById(Long id); +} diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java new file mode 100644 index 0000000..5a5be15 --- /dev/null +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/SystemTemplateUserRelationMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) Mapper 接口 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface SystemTemplateUserRelationMapper extends BaseMapper { + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml new file mode 100644 index 0000000..8667ec0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, group_name, create_user_id, create_user_name, create_time, update_time, remark + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml new file mode 100644 index 0000000..9f8a65b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentGroupRelationMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + id, group_id, equipment_id, create_time, update_time + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml new file mode 100644 index 0000000..b9557f0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentSpecialCertificateMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + id, equipment_id, certificate_no, certificate_name, check_organization, check_date, certificate_valid, minio_file_name, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml new file mode 100644 index 0000000..df4c992 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml new file mode 100644 index 0000000..41c6bd6 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFileConfigMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, download_no, business_module_name, business_download_type, minio_file_name, file_name, desc, create_user, update_user, create_time, update_time + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml new file mode 100644 index 0000000..43c12b1 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemFlowFormMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, form_id, form_name, form_content, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml new file mode 100644 index 0000000..343cd0c --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, system_type, notice_no, notice_title, notice_publisher, notice_company, notice_time, notice_sketch, notice_content, minio_file_name, create_time, update_time + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml new file mode 100644 index 0000000..430a93d --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemNoticeUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, notice_id, user_id, create_time, update_time + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml new file mode 100644 index 0000000..35bc79b --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemSignMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + id, system_type, sign_no, sign_name, sign_desc, sign_director, sign_type, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml new file mode 100644 index 0000000..9514ca0 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id, system_type, template_no, template_name, template_type, template_desc, template_creator, minio_file_name, create_time, update_time + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml new file mode 100644 index 0000000..0167150 --- /dev/null +++ b/casic-metering-dao/src/main/resources/mapper/system/SystemTemplateUserRelationMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + id, template_id, user_id, create_time, update_time + + + diff --git a/casic-metering-eqpt-api/pom.xml b/casic-metering-eqpt-api/pom.xml new file mode 100644 index 0000000..456fdbf --- /dev/null +++ b/casic-metering-eqpt-api/pom.xml @@ -0,0 +1,237 @@ + + + + casic-metering-eqpt-xichang + com.casic + 2.0.0 + + 4.0.0 + + casic-metering-eqpt-api + jar + casic web api启动入口 + + + + + com.casic + casic-metering-service + 2.0.0 + + + + com.casic + casic-metering-job + 2.0.0 + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-core + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-file-support + ${admin.version} + + + com.casic + casic-cache-redis + ${extension.version} + + + com.casic + casic-export-support + ${extension.version} + + + com.casic + casic-file + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + + + org.springframework.boot + spring-boot-starter-web + ${boot.version} + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + com.casic + casic-area-starter + ${admin.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + + + junit + junit + + + org.flowable + flowable-spring-boot-starter + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-app + + + org.flowable + flowable-form-spring-configurator + + + org.flowable + flowable-idm-spring-configurator + + + mybatis + org.mybatis + + + + + org.flowable + flowable-bpmn-model + ${flowable.version} + compile + + + org.flowable + flowable-json-converter + ${flowable.version} + compile + + + org.flowable + flowable-bpmn-converter + ${flowable.version} + compile + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + casic-metering-eqpt-api-${pro.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApiApplication + true + ./ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven.assembly.plugin.version} + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + + + true + true + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/build/bin/restart.sh b/casic-metering-eqpt-api/src/main/build/bin/restart.sh new file mode 100644 index 0000000..0603e89 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/restart.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "restarting $jar_name ..." +sh ./stop.sh +sh ./start.sh diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.bat b/casic-metering-eqpt-api/src/main/build/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-metering-eqpt-api/src/main/build/bin/start.sh b/casic-metering-eqpt-api/src/main/build/bin/start.sh new file mode 100644 index 0000000..aead074 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "starting $jar_name ..." + +nohup java -jar ./lib/${jar_name} >/dev/null 2>log & diff --git a/casic-metering-eqpt-api/src/main/build/bin/stop.sh b/casic-metering-eqpt-api/src/main/build/bin/stop.sh new file mode 100644 index 0000000..b97ea4d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +jar_name="${project.build.finalName}.jar" +echo "stopping $jar_name ..." + +PID=$(ps -ef | grep ${jar_name} | grep -v grep | awk '{print $2}') + +OLD_IFS="$IFS" +IFS="," +PIDARR=($PID) +IFS="$OLD_IFS" + +if [ "$PID" == "" ]; then + echo "process ${jar_name} not exit" +else + for ID in $PID + do + echo "process id: $ID" + + kill -9 ${ID} + + if [ $? -eq 0 ]; then + echo "kill ${jar_name} ${ID} success" + else + echo "kill ${jar_name} ${ID} fail" + exit + fi + done +fi + +echo "stop ${jar_name}" diff --git a/casic-metering-eqpt-api/src/main/build/package.xml b/casic-metering-eqpt-api/src/main/build/package.xml new file mode 100644 index 0000000..53890c0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/build/package.xml @@ -0,0 +1,45 @@ + + + package + + zip + tar.gz + + true + + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + restart.sh + stop.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java new file mode 100644 index 0000000..aedf6d7 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/CasicApiApplication.java @@ -0,0 +1,36 @@ +package com.casic.missiles; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot启动类 + */ +//排除Activiti中的Security,不排除访问项目会跳转Security登录页面 +//@SpringBootApplication(exclude = { +// org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, +// org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class, +// SecurityAutoConfiguration.class +//}) +@SpringBootApplication +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +@Slf4j +@EnableScheduling +@ServletComponentScan +@MapperScan("com.casic.missiles.mapper") +public class CasicApiApplication { + public static void main(String[] args) { + SpringApplication.run(CasicApiApplication.class, args); + log.info("CasicApiApplication is success!"); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java new file mode 100644 index 0000000..5537674 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MinioFileController.java @@ -0,0 +1,79 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.lang.Assert; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.utils.MinioUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/11/27 19:38 + */ +@Api(tags = "文件上传下载接口") +@Controller +@RequestMapping("/minio/file") +public class MinioFileController { + @Autowired + private MinioUtil minioUtil; + + /** + * 文件上传(minio) + */ + @ApiOperation("文件上传") + @PostMapping("/upload") + @ResponseBody + public ReturnDTO upload(@RequestBody MultipartFile[] multipartFile) { + Assert.isFalse(Objects.isNull(multipartFile), () -> { + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + }); + List nameList = minioUtil.upload(multipartFile); + return ReturnUtil.success(nameList); + } + + /** + * 文件下载(minio) + */ + @ApiOperation("文件下载") + @PostMapping("/download/{fileName}") + @ResponseBody + public ReturnDTO upload(@PathVariable(name = "fileName") String fileName) { + ResponseEntity download = minioUtil.download(fileName); + return ReturnUtil.success(download); + } + + /** + * 文件流下载(minio) + */ + @ApiOperation("文件流下载") + @PostMapping("/download/stream") + @ResponseBody + public void upload(@RequestParam(name = "fileName") String fileName, HttpServletResponse response) { + minioUtil.downloadStream(fileName, response); + } + + /** + * 文件路径(minio) + * 实现静态文件url获取 + */ + @ApiOperation("文件url获取") + @GetMapping("/url") + @ResponseBody + public ReturnDTO getFileUrl(@RequestParam(name = "fileName") String fileName) { + return ReturnUtil.success(minioUtil.getFileUrl(fileName)); + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..2eb29c2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,83 @@ +package com.casic.missiles.controller; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.core.application.enums.LoginType; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.model.auth.CasicCustomToken; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.model.response.SuccessResponseData; +import com.casic.missiles.modular.domain.constants.PermissionConstants; +import com.casic.missiles.modular.interfaces.log.LogManager; +import com.casic.missiles.modular.interfaces.log.factory.LogTaskFactory; +import com.casic.missiles.modular.system.dto.LoginSuccessDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.util.HttpContext.getIp; + + +/** + * 仅为mock登录使用 + * + * @author lenovo + */ +@Controller +@RequestMapping("/route") +@Slf4j +public class MockController extends BaseController { + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(String username, String password) { + super.getSession().setAttribute(PermissionConstants.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (StrUtil.hasEmpty(username, password)) { + username = "cz"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionConstants.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //token自定义 + CasicCustomToken token = new CasicCustomToken(username, password); + token.setType(LoginType.PASSWORD); + token.setRememberMe(false); + + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + AuthUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + super.getSession().setAttribute(PermissionConstants.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginSuccessDTO(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java new file mode 100644 index 0000000..ecc74ba --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentApprovalController.java @@ -0,0 +1,113 @@ +package com.casic.missiles.controller.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.flowable.ApprovalRevokeRequest; +import com.casic.missiles.dto.flowable.ApprovalSubmitRequest; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentApprovalForm; +import com.casic.missiles.dto.flowable.BaseApprovalRequest; +import com.casic.missiles.model.equipment.EquipmentInfoApproval; +import com.casic.missiles.service.equipment.IEquipmentInfoApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Api(tags = "设备审批管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentApprovalController extends BaseController { + + private final IEquipmentInfoApprovalService approvalService; + + @ApiOperation("保存、编辑审批") + @PostMapping("/approval/saveOrUpdate") + @ResponseBody + public ReturnDTO saveApproval(@RequestBody EquipmentApprovalForm approvalForm) { + Long approvalId = approvalService.saveOrUpdateApproval(approvalForm); + return ReturnUtil.success(approvalId); + } + + @ApiOperation("删除审批") + @PostMapping("/approval/delete") + @ResponseBody + public ReturnDTO deleteApproval(Long id) { + approvalService.removeApproval(id); + return ReturnUtil.success(); + } + + @ApiOperation("提交审批") + @PostMapping("/approval/submit") + @ResponseBody + public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) { + return approvalService.submitApproval(submitRequest); + } + + @ApiOperation("取消审批") + @PostMapping("/approval/cancel") + @ResponseBody + public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) { + return approvalService.cancelApproval(revokeRequest); + } + + @ApiOperation("同意审批") + @PostMapping("/approval/agree") + @ResponseBody + public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) { + return approvalService.agreeApproval(agreeRequest); + } + + @ApiOperation("拒绝审批") + @PostMapping("/approval/refuse") + @ResponseBody + public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) { + return approvalService.refuseApproval(refuseRequest); + } + + @ApiOperation("查看审批-基本信息") + @GetMapping("/approval/detail") + @ResponseBody + public ReturnDTO approvalDetail(Long id) { + EquipmentApprovalForm info = approvalService.approvalInfoDetail(id); + return ReturnUtil.success(info); + } + + @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消") + @GetMapping("/approval/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String approvalStatus) { + Page page = PageFactory.defaultPage(); + page = approvalService.listPage(page, equipmentNo, equipmentName, equipmentType, usePosition, usageStatus, certificateValidStart, certificateValidEnd, approvalStatus); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-待审批") + @GetMapping("/approval/toApprovalListPage") + @ResponseBody + public ReturnDTO toApprovalListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.toApprovalListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("审批列表-已审批") + @GetMapping("/approval/approvedListPage") + @ResponseBody + public ReturnDTO approvedListPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd, String formId) { + Page page = PageFactory.defaultPage(); + page = approvalService.approvedListPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd, formId); + return ReturnUtil.success(super.packForBT(page)); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java new file mode 100644 index 0000000..ff2422d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentGroupController.java @@ -0,0 +1,37 @@ +package com.casic.missiles.controller.equipment; + +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 受检设备-设备分组信息表 前端控制器 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Api(tags = "设备分组管理接口") +@Slf4j +@RestController +@RequestMapping("/equipment/group") +@RequiredArgsConstructor +public class EquipmentGroupController { + + private final IEquipmentGroupInfoService groupInfoService; + + @PostMapping("add") + public ReturnDTO add(@RequestBody EquipmentGroupForm groupForm){ + groupInfoService.addGroup(groupForm); + return ReturnUtil.success(); + } + + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java new file mode 100644 index 0000000..6afcea0 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -0,0 +1,59 @@ +package com.casic.missiles.controller.equipment; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.equipment.EquipmentAggr; +import com.casic.missiles.model.equipment.EquipmentInfo; +import com.casic.missiles.service.equipment.IEquipmentInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api(tags = "设备管理接口") +@Slf4j +@Controller +@RequestMapping("/equipment") +@RequiredArgsConstructor +public class EquipmentInfoController extends BaseController { + + private final IEquipmentInfoService equipmentInfoService; + + @ApiOperation("设备分页列表") + @GetMapping("/info/listPage") + @ResponseBody + public ReturnDTO listPage(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + Page page = PageFactory.defaultPage(); + page = equipmentInfoService.listPage(page, equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @GetMapping("/info/list") + @ResponseBody + public ReturnDTO list(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.list(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } + + @ApiOperation("设备聚合列表") + @GetMapping("/info/groupByName") + @ResponseBody + public ReturnDTO groupByName(String equipmentNo, String equipmentName, String equipmentType, List deptIds, String usePosition, String usageStatus, + String certificateValidStart, String certificateValidEnd) { + List list = equipmentInfoService.groupByName(equipmentNo, equipmentName, equipmentType, deptIds, usePosition, usageStatus, certificateValidStart, certificateValidEnd); + return ReturnUtil.success(list); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java new file mode 100644 index 0000000..d9d718d --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -0,0 +1,192 @@ +package com.casic.missiles.controller.system; + + +import cn.afterturn.easypoi.entity.ImageEntity; +import com.casic.missiles.utils.PdfUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; + +@Api(tags = "文档格式转换接口") +@Controller +@RequestMapping("/poi") +public class PoiController { + + private String filepath="C:\\upload"; + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf1") + @ResponseBody + public void convertWordToPdf1() throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + } + File tf = new File(wordDir + File.separator + "ttt.docx"); +// File tf_pic = new File(wordDir + File.separator + "logo.jpg"); +// String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("assetName", "彭于晏"+i); + param.put("assetModel", "男"+i); + param.put("assetNo", "中国"+i); + param.put("validDate", "中国"+i); +// ImageEntity image = new ImageEntity(); +// image.setHeight(100); +// image.setWidth(100); +// image.setUrl(pic_url); +// image.setData(PdfUtil.getImageBase64(pic_url)); +// param.put("image", image); + dataList.add(param); + } + + params.put("assetList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "tttt1.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); +// System.out.println("****新模板"+word); + + } + + @ApiOperation("word转pdf") + @PostMapping(value = "/convertWordToPdf") + @ResponseBody + public void convertWordToPdf(HttpServletResponse response) throws Exception { + File uploadFile = new File(filepath); + String wordDir = ""; + String pdfDir = ""; + if (!uploadFile.exists()) { + uploadFile.mkdirs(); + } + if (!filepath.endsWith("/")) { + wordDir = filepath + File.separator + "word"; + pdfDir = filepath + File.separator + "pdf"; + } + File tf = new File(wordDir + File.separator + "tem.docx"); + File tf_pic = new File(wordDir + File.separator + "logo.jpg"); + String pic_url = tf_pic.getCanonicalPath(); + Calendar now = Calendar.getInstance(); + Map params = new HashMap<>(); + List> dataList=new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Map param = new HashMap<>(); + param.put("name", "彭于晏"+i); + param.put("sex", "男"+i); + param.put("address", "中国"+i); + ImageEntity image = new ImageEntity(); + image.setHeight(100); + image.setWidth(100); + image.setUrl(pic_url); + image.setData(PdfUtil.getImageBase64(pic_url)); + param.put("image", image); + dataList.add(param); + } + + params.put("dataList",dataList); + params.put("y", now.get(Calendar.YEAR)); + params.put("m", (now.get(Calendar.MONTH) + 1)); + params.put("d", now.get(Calendar.DAY_OF_MONTH)); + + String fileName = "wordExport.docx"; + String word = PdfUtil.exportWord(tf.getPath(), wordDir, fileName, params); + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; + + if (word.equals("")) { + Assert.notNull(word, "word路径不能为空"); + } else { + PdfUtil.convertDocx2Pdf(word, pdfDir + File.separator + pdfFileName); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); //中文名称下载 + byte[] buffer = new byte[1024]; + FileInputStream fis = null; + BufferedInputStream bis = null; + OutputStream outputStream = null; + try { + fis = new FileInputStream(pdfDir + File.separator + pdfFileName); + bis = new BufferedInputStream(fis); + outputStream = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + outputStream.write(buffer, 0, i); + i = bis.read(buffer); + } + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + File file = new File(pdfDir); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + +// @ApiOperation("test") +// @PostMapping(value = "/testPrint") +// @ResponseBody +// public void testPrint() throws Exception { +// FilePrintRegisterUtils.docToDocx("C:\\upload\\word\\test-report.doc","C:\\upload\\word\\test-report.docx"); +// +// File tf = new File("C:\\upload\\word\\test-report.docx"); +// Calendar now = Calendar.getInstance(); +// Map params = new HashMap<>(); +// params.put("customerName","张三"); +// params.put("customerAddress","北京"); +// params.put("sampleNo","10001000"); +// params.put("sampleName","样品001"); +// params.put("manufacturingNo","样品001"); +// params.put("y", now.get(Calendar.YEAR)); +// params.put("m", (now.get(Calendar.MONTH) + 1)); +// params.put("d", now.get(Calendar.DAY_OF_MONTH)); +// +// String fileName = "testParams.docx"; +// String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); +// System.out.println("****新模板"+word); +// +// } + +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java new file mode 100644 index 0000000..4023309 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemController.java @@ -0,0 +1,296 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.IdsDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 系统管理-常用工具、通知公告 + * @Author: wangpeng + * @Date: 2022/11/21 20:31 + */ +@Api(tags = "系统管理接口") +@Controller +@RequestMapping("/system") +public class SystemController extends ExportController { + @Autowired + private ISystemSignService signService; + @Autowired + private ISystemNoticeService noticeService; + @Autowired + private ISystemTemplateService templateService; + + @ApiOperation("签名/签章列表(分页)") + @PostMapping("/sign/listPage") + @ResponseBody + public ReturnDTO> signListPage(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(signService.listPage(page, request))); + } + + @ApiOperation("签名/签章详情") + @PostMapping("/sign/detail") + @ResponseBody + public ReturnDTO signDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.signDetail(idDTO.getId()); + } + + @ApiOperation("签名/签章列表") + @PostMapping("/sign/list") + @ResponseBody + public ReturnDTO> signList(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(signService.list(request)); + } + + @ApiOperation("签名/签章导出") + @PostMapping("/sign/listExport") + @ResponseBody + public void export(@RequestBody @Valid SignListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = signService.listByIds(request.getIds()); + } else { + list = signService.list(request); + } + super.exportExcel(SystemSign.class, list, ExportEnum.SIGN_EXPORT.getSheetName()); + } + + @ApiOperation("签名/签章新建") + @PostMapping("/sign/add") + @ResponseBody + public ReturnDTO signAdd(@RequestBody @Valid SignAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.addSign(request); + } + + @ApiOperation("签名/签章更新") + @PostMapping("/sign/update") + @ResponseBody + public ReturnDTO signUpdate(@RequestBody @Valid SystemSign systemSign, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return signService.updateSign(systemSign); + } + + @ApiOperation("签名/签章删除") + @PostMapping("/sign/delete") + @ResponseBody + public ReturnDTO signDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteSign(idDTO.getId()); + } + + @ApiOperation("签名/签章批量删除") + @PostMapping("/sign/batchDelete") + @ResponseBody + public ReturnDTO signBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return signService.deleteBatchSign(idsDTO.getIds()); + } + + @ApiOperation("获取本人可使用签名/签章") + @GetMapping("/sign/usable") + @ResponseBody + public ReturnDTO> signUsable() { + return ReturnUtil.success(signService.usableSign()); + } + + @ApiOperation("文件模板管理-文件管理模板列表(分页)(原始记录/证书报告/核查记录等)") + @PostMapping("/template/listPage") + @ResponseBody + public ReturnDTO> templateListPage(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(templateService.listPage(page, request))); + } + + @ApiOperation("文件模板管理-文件管理模板详情") + @PostMapping("/template/detail") + @ResponseBody + public ReturnDTO templateDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.templateDetail(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板列表") + @PostMapping("/template/list") + @ResponseBody + public ReturnDTO> templateList(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return ReturnUtil.success(templateService.list(request)); + } + + @ApiOperation("文件模板管理-文件管理模板导出") + @PostMapping("/template/listExport") + @ResponseBody + public void export(@RequestBody @Valid TemplateListRequest request, BindingResult bindingResult) throws IOException { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = templateService.listByIds(request.getIds()); + } else { + list = templateService.list(request); + } + super.exportExcel(SystemTemplate.class, list, ExportEnum.TEMPLATE_EXPORT.getSheetName()); + } + + @ApiOperation("文件模板管理-文件管理模板新建") + @PostMapping("/template/add") + @ResponseBody + public ReturnDTO templateAdd(@RequestBody @Valid TemplateAddRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.addTemplate(request); + } + + @ApiOperation("文件模板管理-文件管理模板更新") + @PostMapping("/template/update") + @ResponseBody + public ReturnDTO templateUpdate(@RequestBody @Valid SystemTemplate systemTemplate, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return templateService.updateTemplate(systemTemplate); + } + + @ApiOperation("文件模板管理-文件管理模板删除") + @PostMapping("/template/delete") + @ResponseBody + public ReturnDTO templateDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteTemplate(idDTO.getId()); + } + + @ApiOperation("文件模板管理-文件管理模板批量删除") + @PostMapping("/template/batchDelete") + @ResponseBody + public ReturnDTO templateBatchDelete(@RequestBody @Valid IdsDTO idsDTO) { + Assert.isFalse(CollectionUtils.isEmpty(idsDTO.getIds()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return templateService.deleteBatchTemplate(idsDTO.getIds()); + } + + @ApiOperation("通知公告列表/详情") + @PostMapping("/notice/listPage") + @ResponseBody + public ReturnDTO> noticeListPage(@RequestBody NoticeListRequest request) { + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(noticeService.listPage(page, request))); + } + + @ApiOperation("通知公告新建") + @PostMapping("/notice/add") + @ResponseBody + public ReturnDTO noticeAdd(@RequestBody @Valid NoticeAddRequest noticeAddRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.addNotice(noticeAddRequest); + } + + @ApiOperation("通知公告更新") + @PostMapping("/notice/update") + @ResponseBody + public ReturnDTO noticeUpdate(@RequestBody @Valid SystemNotice systemNotice, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.updateNotice(systemNotice); + } + + @ApiOperation("通知公告删除") + @PostMapping("/notice/delete") + @ResponseBody + public ReturnDTO noticeDelete(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return noticeService.deleteNotice(idDTO.getId()); + } + + @ApiOperation("通知公告标记已读") + @PostMapping("/notice/read") + @ResponseBody + public ReturnDTO noticeRead(@RequestBody @Valid NoticeReadRequest noticeReadRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return noticeService.noticeRead(noticeReadRequest); + } + + @ApiOperation("获取业务编号前缀列表") + @PostMapping("/prefixcode/list") + @ResponseBody + public Object getPreFixCodeList() throws Exception{ + Class fixCodeEnumClass = PrefixCodeEnum.class; + Field[] fixCodeEnumFileds = fixCodeEnumClass.getDeclaredFields(); + List fixCodeList=new ArrayList<>(); + for(Field field: fixCodeEnumFileds){ + fixCodeList.add( field.get(PrefixCodeEnum.class).toString()); + } + return ReturnUtil.success(fixCodeList); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java new file mode 100644 index 0000000..05ddf1f --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -0,0 +1,183 @@ +package com.casic.missiles.controller.system; + +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.*; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.service.system.ISystemFlowFormService; +import com.casic.missiles.utils.ConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * @Description: 流程管理 + * 功能: + * 1.json转bpmn,里面传入了条件、审批人等信息,实现flowable流程定义生成、表单信息存储、表单及流程定义关联 + * 2.流程定义列表、编辑、详情、废止、删除、导出 + * @Author: wangpeng + * @Date: 2022/12/12 16:46 + */ +@Api(tags = "流程管理接口") +@Controller +@RequestMapping("/system/flow") +public class SystemFlowDefController extends ExportController { + @Autowired + private IFlowDefService processService; + @Autowired + private ISystemFlowFormService flowFormService; + + /** + * 保存流程定义,流程实例中才要传业务表id + * 该接口同时实现存储表单信息、流程定义信息 + * 前端传入workFlowDef实体中增加flowKey字段,用于更新流程定义 + * 前端传入workFlowDef实体中增加directorId字段(用户表用户id),用于作为流程负责人 + * 前端传入_value实体中增加formId、formName、formDesc,flowDef用nodeConfig + */ + @ApiOperation("加载流程定义(jsonToBpmn)") + @PostMapping("/jsonToBpmn") + @ResponseBody + public Object jsonToBpmn(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + System.err.println(jsonObject.toJSONString()); + ReturnDTO result = processService.jsonToBpmn(jsonObject); + return result; + } + + /** + * 流程定义列表 + * 关联查询ACT_RE_PROCDEF(流程定义表)、ACT_RE_DEPLOYMENT(流程部署表,一个流程定义id一个部署id,一个流程定义有多个版本) + */ + @ApiOperation("流程定义列表(分页)") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> listPage(@RequestBody FlowListRequest request) { + Page page = PageFactory.defaultPage(); + List flowProcDefDTOList = processService.listPage(page, request); + page.setRecords(flowProcDefDTOList); + return ReturnUtil.success(super.packForBT(page)); + } + + /** + * 流程定义编辑 + * 钉钉vue2中编辑会根据生成的prefix+templateId生成流程id,流程id相同flowable会增加一个新版本的流程定义 + */ + @ApiOperation("流程定义编辑") + @PostMapping("/update") + @ResponseBody + public ReturnDTO update(@RequestBody JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + return processService.update(jsonObject); + } + + /** + * 流程定义详情 + * 参考钉钉vue2中process_templates表会保存最新的模板信息(包括表单信息、流程定义信息) + * 看是否能根据部署id获取flowable中流程定义json,不能则将流程定义json存到流程表单表中 + * 全局流程变量是在流程实例启动时设置的,在钉钉vue2通过流程实例id查看详情接口中可以获取流程实例及实时流程进程图 + * 所以将流程定义json存到表单表中,表单与流程定义多对一 + */ + @ApiOperation("流程定义详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO detail(@RequestBody @Valid FlowDetailRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.detail(request.getFormId()); + } + + /** + * 流程定义废止 + * 参考RuoYi激活或挂起流程定义 + */ + @ApiOperation("流程定义挂起/激活(废止/挂起)") + @PostMapping("/updateState") + @ResponseBody + public ReturnDTO updateState(@RequestBody @Valid FlowUpdateStateRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.updateState(request); + } + + /** + * 流程定义删除 + * 参考RuoYi删除流程定义 + */ + @ApiOperation("流程定义删除") + @PostMapping("/delete") + @ResponseBody + public ReturnDTO delete(@RequestBody @Valid FlowDeleteRequest request, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return processService.delete(request); + } + + @ApiOperation("流程定义导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody FlowListRequest request) throws IOException { + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + } + + /** + * 流程表单信息列表 + */ + @ApiOperation("流程表单信息列表") + @GetMapping("/flowFormList") + @ResponseBody + public ReturnDTO> flowFormList() { + List list = flowFormService.list(); + List flowFormListResponses = ConvertUtils.sourceToTarget(list, FlowFormListResponse.class); + return ReturnUtil.success(flowFormListResponses); + } + + /** + * 获取发起人主管层级数 + * 主管的角色是组织负责人(TIPS字段为director) + * 需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + */ + @ApiOperation("获取发起人主管层级数") + @GetMapping("/directorLevel") + @ResponseBody + public ReturnDTO directorLevel(Long userId) { + Assert.isFalse(Objects.isNull(userId), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + int level = flowFormService.getDirectorLevel(userId); + if(0 == level){ + return ReturnUtil.failed("该用户无部门主管或该用户为系统管理员!"); + } + HashMap map = new HashMap<>(); + map.put("level", level); + return ReturnUtil.success(map); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java new file mode 100644 index 0000000..e08276c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/system/download/SystemFileConfigController.java @@ -0,0 +1,114 @@ +package com.casic.missiles.controller.system.download; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.model.exception.enums.CoreExceptionEnum; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.Objects; + +/** + * 文件配置管理 + * @author cz + * @since 2023-04-03 + */ +@Api(tags = "系统管理-文件配置管理接口") +@RestController +@RequestMapping("/download/center") +@AllArgsConstructor +public class SystemFileConfigController extends ExportController { + + private final IDownloadCenterService downloadCenterService; + + @ApiOperation("下载文件分页") + @PostMapping("/listPage") + @ResponseBody + public ReturnDTO> downloadFileListPage(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult) throws Exception{ + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(downloadCenterService.listPage(page, request))); + } + + @ResponseBody + @ApiOperation("更新下载文件") + @PostMapping("/update") + public ReturnDTO updateDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.updateDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/add") + public ReturnDTO addDownloadFile(@RequestBody @Valid SystemFileConfig downloadCenter, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.addDownloadFile(downloadCenter); + } + + @ResponseBody + @ApiOperation("下载文件详情") + @PostMapping("/detail") + public ReturnDTO downloadFileDetail(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return ReturnUtil.success(downloadCenterService.downloadFileDetail(idDTO.getId())); + } + + @ResponseBody + @ApiOperation("删除下载文件") + @PostMapping("/delete") + public ReturnDTO deleteDownloadFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return downloadCenterService.deleteDownloadFile(idDTO.getId()); + } + + @ResponseBody + @ApiOperation("新增下载文件") + @PostMapping("/downloadFile") + public ReturnDTO downloadFile(@RequestBody @Valid DownloadFileRequest downloadFileRequest, BindingResult bindingResult) { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + return downloadCenterService.downloadFile(downloadFileRequest); + + } + + @ApiOperation("文件导出") + @PostMapping("/listExport") + @ResponseBody + public void export(@RequestBody @Valid DownloadListRequest request, BindingResult bindingResult, HttpServletResponse response) throws Exception { + if(bindingResult.hasErrors()){ + throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); + } + downloadCenterService.downloadFileExport(request,response); + } +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java new file mode 100644 index 0000000..2e1215c --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/filter/CORSFilter.java @@ -0,0 +1,44 @@ +package com.casic.missiles.filter; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/27 11:08 + */ +//@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +@WebFilter(filterName = "CORSFilter", urlPatterns = "/minio/*") +public class CORSFilter implements Filter { + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*"); + if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ + response.setStatus(HttpStatus.NO_CONTENT.value()); + }else{ + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} +} diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..03991c9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/handler/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package com.casic.missiles.handler; + +import com.casic.missiles.dto.ReturnUtil; + +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.exception.BusinessExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Description: 全局异常处理 + * @Author: wangpeng + * @Date: 2022/11/24 8:50 + */ +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ReturnUtil.failed(exception.getCode(), exception.getMessage()); + } + + /** + * 编号重复异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({DuplicateKeyException.class}) + public Object handleDuplicateKeyException() { + return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); + } + + /** + * 参数校验失败异常 + */ + @ResponseBody + @ExceptionHandler({MethodArgumentNotValidException.class}) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); + } +} diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..4a951f2 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -0,0 +1,43 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 + redis: + host: 111.198.10.15 + port: 11412 + password: ew5T4K3#203lwh + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +#jms: +# pub-sub-domain: true + session: + store-type: redis +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/websocket/**,/webjars/**,/swagger-ui.html,/swagger-resources + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\casic\tmp\ + dir: D:\casic\tmp\ + meter: + standardEquipment: #标准装置 + remindDay: 30 #到期提醒,提前天数 + delayDay: 30 #到期提醒-删除,提醒推迟天数 + template: + calibration: "现场检定审批报告" + environmental: "现场环境记录" + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info +# level.org.flowable: debug #flowable日志,可查看SQL执行 \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..ce49c66 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-prod.yml @@ -0,0 +1,32 @@ +server: + port: 8082 +# context-path: /callcenter/api +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&nullCatalogMeansCurrent=true + username: root + password: Casic203 + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true + # session: + # store-type: redis + redis: + host: 127.0.0.1 + port: 6379 + password: + +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken + #图片下载本地地址 + file: + uploadPath: /tmp/ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-test.yml b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..ec19795 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application-test.yml @@ -0,0 +1,34 @@ +server: + port: 5909 +################### spring配置 ################### +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + username: root + password: Casic203 +#jms: +# pub-sub-domain: true +# session: +# store-type: redis +# redis: +# host: 111.198.10.15 +# port: 11412 +# password: ew5T4K3#203lwh +# serializer: org.springframework.data.redis.serializer.StringRedisSerializer +# redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer +casic: + #kaptcha-open: false #是否开启登录时验证码 (true/false) + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + +logging: + level.root: info + level.com.casic: debug + level.org.springframework.web: info \ No newline at end of file diff --git a/casic-metering-eqpt-api/src/main/resources/config/application.yml b/casic-metering-eqpt-api/src/main/resources/config/application.yml new file mode 100644 index 0000000..a6da2dc --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/config/application.yml @@ -0,0 +1,125 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + servlet: + multipart: + max-file-size: 200MB + max-request-size: 1000MB + activiti: + #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常 + #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建 + #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) + #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) + database-schema-update: true + #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 + db-history-used: true + #记录历史等级 可配置的历史级别有none, activity, audit, full + #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 + #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 + #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 + #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 + history-level: full + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + check-process-definitions: false + #启用作业执行器 + async-executor-activate: false + #启用异步执行器 + job-executor-activate: false + +mybatis-plus: + global-config: + #字段策略 0:"所有字段都更新和插入" 1:"只更新和插入非NULL值" 2:"只更新和插入非NULL值且非空字符串" + #field-strategy: 1 + enable-sql-runner: true + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty +# logic-delete-field: isDel #全局逻辑删除实体字段名 +# logic-delete-value: 1 #逻辑已删除值 +# logic-not-delete-value: 0 #逻辑未删除值 + #MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法) + configuration: + # 配置结果集属性为空时 是否映射返回结果 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + map-underscore-to-camel-case: true + mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml + +minio: + # endpoint: http://127.0.0.1:9000 + endpoint: http://111.198.10.15:21408 + #本地 + #测试环境,Access Keys中生成accessKey、secretKey + #账号密码:admin、admin123 + #账号密码:minioadmin、minioadmin + #端口:启动两个端口API、Console + #minio服务重启会导致accessKey、secretKey更新,需重新配置 + accessKey: N5YL2gqg3fTByXXI + secretKey: ygOJeueOvLBgi78AG13n201XCoU6Xcze + bucketName: test +# region: us-east-1 + +xxl: + job: + admin: + # xxl-job后台管理界面的地址 + addresses: http://111.198.10.15:21605/xxl-job-admin + executor: + # 此执行器的名称 + appname: casic-metering-job + # 此执行器的ip、端口,每个节点对应自己的ip,端口用于任务执行的通信 + ip: 127.0.0.1 + port: 9999 + # 此执行器的日志存放路径 + logpath: logs/xxl-job/casic-metering-job + # 此执行器的日志保存时间 + logretentiondays: 7 + accessToken: default_token + +flowable: + dmn: + enabled: false + cmmn: + enabled: false + idm: + enabled: false + #异步执行 + async-history-executor-activate: false + async-executor-activate: false + #流程定义检查 + check-process-definitions: false + content: + enabled: false + app: + enabled: false + eventregistry: + enabled: false + #校验流程文件,默认校验resources下的processes文件夹里的流程文件 + #process-definition-location-prefix: classpath*:/processes/ + #process-definition-location-suffixes: "**.bpmn20.xml, **.bpmn" + +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + no-login-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + +#代码生成器配置 +code: + generate: + #作者 + author: zhangyingjie + #待生成对象表名 + table-name: eqpt_equipment_group_info,eqpt_equipment_group_relation,eqpt_equipment_special_certificate + prefix: eqpt_ + + diff --git a/casic-metering-eqpt-api/src/main/resources/logback-spring.xml b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/casic-metering-eqpt-api/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java new file mode 100644 index 0000000..609b68f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/constants/MeterDictCode.java @@ -0,0 +1,122 @@ +package com.casic.missiles.constants; + +/** + * @Description: 字典名枚举 + * @Author: wangpeng + * @Date: 2022/11/27 10:41 + */ +public interface MeterDictCode { + //审批状态 + String APPROVAL_STATUS = "approvalStatus"; + //实施状态 + String EFFECTIVE_STATUS = "effectiveStatus"; + //文件类别 + String FILE_TYPE = "fileType"; + //行政职务 + String ADMINISTRATION_JOB = "administrationJob"; + //技术职称 + String TECHNOLOGY_JOB = "technologyJob"; + //文化程度 + String EDUCATION = "education"; + //校验类型 + String CHECK_TYPE = "checkType"; + //价格类别 + String PRICE_TYPE = "priceType"; + //项目 + String PRICE_ITEM = "priceItem"; + //业务员折扣权限 + String OPERATOR_DISCOUNT_PERMISSION = "operatorDiscountPermission"; + //负责人折扣权限 + String DIRECTOR_DISCOUNT_PERMISSION = "directorDiscountPermission"; + + /** + * 设备台账字典code + */ + //设备类别 + String EQUIPMENT_CATEGORY = "bizEquipmentCategory"; + //计量标识 + String METER_IDENTIFY = "bizMeterIdentify"; + //设备类型 + String EQUIPMENT_TYPE = "bizEquipmentType"; + //标准类型 + String STANDARD_TYPE = "bizStandardType"; + //等级 + String EQUIPMENT_LEVEL = "bizEquipmentLevel"; + //使用状态 + String USAGE_STATUS = "bizUsageStatus"; + //检定周期 + String MEASURE_CYCLE = "bizMeasureCycle"; + + //管理状态 + String MANAGER_STATE = "managerState"; + //ABC 设备级别 + String ABC = "ABC"; + // 检定周期 + String MESURE_CYCLE = "mesureCycle"; + //专业分类 + String MAJOR_CATEGORY = "majorCategory"; + //检定结果 + String MESURE_RESULT = "mesureResult"; + //管理级别 + String MANAGER_LEVEL = "managerLevel"; + //折旧方法 + String DEPRECIATION_METHOD = "depreciationMethod"; + + /** + * 标准装置 字典code + */ + //类别 + String STANDARD_CATEGORY = "standardCategory"; + //管理状态 + String STANDARD_MANAGER_STATE = "standardManagerState"; + //标准等级 + String STANDARD_LEVEL = "standardLevel"; + //传递范围 + String STANDARD_TRANSMIT_RANGE = "transmitRange"; + //计量专业 + String MEASURE_MAJOR = "measureMajor"; + //资本来源 + String CAPITAL_SOURCE = "capitalSource"; + //标准装置-申请类型 + String STANDARD_APPLY_TYPE = "standardApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_TYPE = "equipmentApplyType"; + //设备-申请类型 + String EQUIPMENT_APPLY_PROCESS_RESULT = "equipmentApplyProcessResult"; + //检查结果 + String CHECK_RESULT = "checkResult"; + //检查结果 + String ACCEPTANCE_CHECK_RESULT = "acceptanceCheckResult"; + + /** + * 业务管理 + */ + //委托书状态 + String ORDER_STATUS = "orderStatus"; + //检测状态 + String MEASURE_STATUS = "measureStatus"; + //打印状态 + String PRINT_STATUS = "printStatus"; + //证书类型 + String CERTIFICATE_TYPE = "certificationType"; + //证书类别 + String CERTIFICATE_CLASS = "certificationClass"; + //证书管理-检校专业 + String CALIBRATION_MAJOR = "calibrationMajor"; + //分包原因 + String OUTSOURCE_REASON = "outsourceReason"; + + /** + * 工作台 + */ + String MESSAGE_TYPE = "messageType"; + + String MESSAGE_SOURCE_MODULE = "messageSourceModule"; + // APP全局查询类型 + String APP_AGGREGATE_QUERY_TYPE = "appAggregateQueryType"; + + String BUSINESS_DOWNLOAD_TYPE = "businessDownloadType"; + + String CONFIG_FILE_TYPE = "configFileType"; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java new file mode 100644 index 0000000..88fdac9 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/BaseSystemRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/25 15:33 + */ +@Data +public class BaseSystemRequest { + private Integer systemType = 2; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java new file mode 100644 index 0000000..c09decb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Description: for delete/detail use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdDTO { + @NotNull(message = "主键ID不能为空") + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java new file mode 100644 index 0000000..9ac733f --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @ApiModelProperty(value = "主键id列表", dataType = "List", required = true) + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java new file mode 100644 index 0000000..754fb99 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/EquipmentGroupForm.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class EquipmentGroupForm{ + + @ApiModelProperty("分组基础信息") + EquipmentGroupInfo groupInfo; + @ApiModelProperty("绑定设备列表") + List equipmentList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java new file mode 100644 index 0000000..11b6259 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/NotifyEventStatusDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.flowable; + +import lombok.Builder; +import lombok.Data; + +/** + * @author cz + */ +@Data +@Builder +public class NotifyEventStatusDTO { + + /** + * 业务表主键 + */ + private String id; + /** + * 业务表状态 + */ + private String status; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java new file mode 100644 index 0000000..0b92d02 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadFileRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("下载中心请求参数") +@Data +public class DownloadFileRequest extends BaseSystemRequest { + + private String moduleName; + + private String businessDownloadType; + + private String fileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java new file mode 100644 index 0000000..015a499 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListRequest.java @@ -0,0 +1,42 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author cz + * @date 2023-04-03 + */ +@ApiModel("下载中心请求参数") +@Data +public class DownloadListRequest extends BaseSystemRequest { + + @ApiModelProperty("编号") + private String downloadNo; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("业务类型") + private String businessDownloadType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("开始时间") + private String endTime; + + @ApiModelProperty("结束时间") + private String startTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java new file mode 100644 index 0000000..b5ca77a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/DownloadListResponse.java @@ -0,0 +1,86 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author cz + * @date 2023-04-03 + */ +@Data +@ApiModel("文件列表") +@ColumnWidth(30) +@HeadRowHeight(15) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +public class DownloadListResponse { + + private Long id; + + @ApiModelProperty("下载编号") + @ExcelProperty(value = "文件编号", order = 0) + private String downloadNo; + + @ApiModelProperty("业务模块名称") + @ExcelProperty(value = "业务模块名称", order = 1) + private String moduleName; + + @ApiModelProperty("业务类型") + @DictCodeField(message = "业务类型描述不合法", cacheName = MeterDictCode.BUSINESS_DOWNLOAD_TYPE) + private String businessDownloadType; + + @TableField(exist = false) + @ExcelProperty(value = "业务类型", order =2 ) + private String businessDownloadTypeName; + + @ApiModelProperty("minio存储文件名") + @ExcelProperty(value = "minio存储文件名", order = 3) + private String minioFileName; + + @ApiModelProperty("文件名称") + @ExcelProperty(value = "文件名称", order = 4) + private String fileName; + + @ApiModelProperty("文件类型") + @DictCodeField(message = "文件类型描述不合法", cacheName = MeterDictCode.CONFIG_FILE_TYPE) + private String fileType; + + @ExcelProperty(value = "文件类型", order = 5) + private String fileTypeName; + + @ApiModelProperty("App版本类型") + private String versionName; + + @ApiModelProperty("描述备注") + @ExcelProperty(value = "描述备注", order = 6) + private String descn; + + @ApiModelProperty("创建人id") + private Long createUser; + + @ApiModelProperty("更新人id") + private Long updateUser; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 7) + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "更新时间", order = 8) + private LocalDateTime updateTime; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java new file mode 100644 index 0000000..bee27fb --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowDeleteRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义删除请求实体") +public class FlowDeleteRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java new file mode 100644 index 0000000..6b28ddf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowFormListResponse.java @@ -0,0 +1,19 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 表单列表请求响应 + * @Author: wangpeng + * @Date: 2023/1/12 8:52 + */ +@ApiModel +@Data +public class FlowFormListResponse { + @ApiModelProperty(value = "配置表单id", dataType = "String") + private String formId; + @ApiModelProperty(value = "配置表单名称", dataType = "String") + private String formName; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java new file mode 100644 index 0000000..2d81633 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/12 18:12 + */ +@Data +@ApiModel("流程定义列表请求实体") +public class FlowListRequest extends BaseSystemRequest { + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; +// +// @ApiModelProperty("流程负责人id") +// private Long directorId; + + @ApiModelProperty("流程负责人名字") + private String directorName; + +// @ApiModelProperty("版本") +// private int version; +// +// @ApiModelProperty("部署ID") +// private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活,2:中止") + private Integer suspensionState; + + @ApiModelProperty("部署时间(开始)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentStartTime; + + @ApiModelProperty("部署时间(结束)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java new file mode 100644 index 0000000..acdf7d0 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.system; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

流程定义列表实体类

+ */ +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) +@ExcelIgnoreUnannotated +@Data +@ApiModel("流程定义") +public class FlowProcDefDTO implements Serializable { + + @ExcelProperty("流程编号") + @ApiModelProperty("流程id") + private String id; + + @ExcelProperty("流程名称") + @ApiModelProperty("流程名称") + private String name; + + //多个流程定义的版本不同,key相同 + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + //表单名称代表所属业务 + @ExcelProperty("关联业务") + @ApiModelProperty("配置表单名称/所属业务") + private String formName; + + @ApiModelProperty("配置表单id") + private String formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ExcelProperty("流程状态(1:激活,2:中止)") + @ApiModelProperty("流程定义状态:1激活2中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + @ApiModelProperty("流程负责人id") + private String directorId; + + @ExcelProperty("流程负责人") + @ApiModelProperty("流程负责人") + private String directorName; + + @ExcelProperty("流程描述") + @ApiModelProperty("表单描述/流程定义描述") + private String formDesc; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java new file mode 100644 index 0000000..5acabd3 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowUpdateStateRequest.java @@ -0,0 +1,25 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Description: 流程定义列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/13 18:12 + */ +@Data +@ApiModel("流程定义激活/挂起请求实体") +public class FlowUpdateStateRequest { + @NotBlank(message = "流程部署id不能为空") + @ApiModelProperty("流程部署id") + private String deployId; + + @NotNull(message = "变更状态不能为空") + @ApiModelProperty("变更状态(1:激活,2:挂起)") + private Integer state; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java new file mode 100644 index 0000000..5b6bfae --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeAddRequest.java @@ -0,0 +1,84 @@ +package com.casic.missiles.dto.system; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description: 通知公告请求实体 + * @Author: wangpeng + * @Date: 2022/12/30 14:32 + */ +@ApiModel +@Data +public class NoticeAddRequest extends BaseSystemRequest { + + @ApiModelProperty(value = "主键id(列表接口参数)", dataType = "Long") + @TableId("id") + private Long id; + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "通知公告编号", dataType = "String") + @TableField("notice_no") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "通知公告标题", dataType = "String") + @NotBlank(message = "标题不能为空") + @TableField("notice_title") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + @NotBlank(message = "发布人不能为空") + @TableField("notice_publisher") + private String noticePublisher; + + /** + * 发布单位 + */ + @ApiModelProperty(value = "发布单位", dataType = "String") + @TableField("notice_company") + private String noticeCompany; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间", dataType = "String") + @TableField("notice_time") + private String noticeTime; + + /** + * 内容简述 + */ + @ApiModelProperty(value = "内容简述", dataType = "String") + @TableField("notice_sketch") + private String noticeSketch; + + /** + * 发布内容 + */ + @ApiModelProperty(value = "发布内容", dataType = "String") + @NotBlank(message = "发布内容不能为空") + @TableField("notice_content") + private String noticeContent; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @TableField("minio_file_name") + private String minioFileName; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java new file mode 100644 index 0000000..c396bd7 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeListRequest.java @@ -0,0 +1,45 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 通知公告列表请求实体 + * @Author: wangpeng + * @Date: 2022/11/29 9:57 + */ +@ApiModel +@Data +public class NoticeListRequest extends BaseSystemRequest { + + /** + * 通知公告编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String noticeNo; + + /** + * 通知公告标题 + */ + @ApiModelProperty(value = "标题", dataType = "String") + private String noticeTitle; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人", dataType = "String") + private String noticePublisher; + + /** + * 发布时间 + */ + @ApiModelProperty(value = "发布时间(开始)", dataType = "String") + private String noticeStartTime; + @ApiModelProperty(value = "发布时间(结束)", dataType = "String") + private String noticeEndTime; + + @ApiModelProperty(hidden = true) + private Long userId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java new file mode 100644 index 0000000..628782c --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/NoticeReadRequest.java @@ -0,0 +1,28 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: 通知公告已读请求实体 + * @Author: wangpeng + * @Date: 2023/3/7 14:32 + */ +@ApiModel +@Data +public class NoticeReadRequest { + + @NotNull(message = "登录用户id不能为空") + @ApiModelProperty(value = "登录用户id", dataType = "Long") + private Long userId; + + @NotEmpty(message = "主键id列表不能为空") + @ApiModelProperty(value = "主键id列表", dataType = "List") + private List ids; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java new file mode 100644 index 0000000..0ff3709 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/PushUserMessage.java @@ -0,0 +1,12 @@ +package com.casic.missiles.dto.system; + +import lombok.Data; + +import java.util.List; + +@Data +public class PushUserMessage { + private String title; + private String appMsg; + private List userIds; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java new file mode 100644 index 0000000..cc4dc2e --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignAddRequest.java @@ -0,0 +1,62 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章新建请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignAddRequest extends BaseSystemRequest { + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String", required = true) +// @NotBlank(message = "负责人不能为空") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签章或签名-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "签名/签章-字典code", dataType = "String", required = true) + private String signType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java new file mode 100644 index 0000000..3617658 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignDetailResponse.java @@ -0,0 +1,90 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class SignDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 签章/签名编号 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signNo; + + /** + * 签章/签名名称 + */ + @ApiModelProperty(value = "签章/签名编号", dataType = "String") + private String signName; + + /** + * 签章/签名描述 + */ + @ApiModelProperty(value = "签章/签名描述", dataType = "String") + private String signDesc; + + /** + * 签章/签名负责人 + */ + @ApiModelProperty(value = "签章/签名负责人", dataType = "String") + private String signDirector; + + /** + * 签章或签名-字典code + */ + @ApiModelProperty(value = "签章/签名-字典code", dataType = "String") + private String signType; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long", required = true) + private Long signUserId; + + /** + * 签名用户名 + */ + @ApiModelProperty(value = "签名用户名", dataType = "String", required = true) + private String signUserName; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java new file mode 100644 index 0000000..526fbec --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SignListRequest.java @@ -0,0 +1,60 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 签名、签章列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class SignListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + private String signType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String signNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String signName; + + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人", dataType = "String") + private String signDirector; + + /** + * 签名用户id + */ + @ApiModelProperty(value = "签名用户id", dataType = "Long") + private Long signUserId; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java new file mode 100644 index 0000000..67bd80a --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/SysUserDTO.java @@ -0,0 +1,23 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 详情用户列表实体 + * @Author: wangpeng + * @Date: 2022/12/12 14:15 + */ +@ApiModel +@Data +public class SysUserDTO { + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + @ApiModelProperty(value = "账户名", dataType = "String", required = true) + private String account; + @ApiModelProperty(value = "姓名", dataType = "String", required = true) + private String name; + @ApiModelProperty(value = "部门id", dataType = "Long", required = true) + private Long deptId; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java new file mode 100644 index 0000000..aff1265 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateAddRequest.java @@ -0,0 +1,56 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板/证书报告模板请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 14:32 + */ +@ApiModel +@Data +public class TemplateAddRequest extends BaseSystemRequest { + /** + * 原始记录模板/证书报告模板名称 + */ + @ApiModelProperty(value = "名称", dataType = "String", required = true) + @NotBlank(message = "名称不能为空") + private String templateName; + + /** + * 原始记录模板/证书报告模板描述 + */ + @ApiModelProperty(value = "描述", dataType = "String") + private String templateDesc; + + /** + * 原始记录模板/证书报告模板创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String", required = true) + @NotBlank(message = "创建人不能为空") + private String templateCreator; + + /** + * 原始记录模板/证书报告模板-字典code + */ + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String", required = true) + private String templateType; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回名称", dataType = "String") + @NotBlank(message = "上传文件不能为空") + private String minioFileName; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") +// @NotEmpty(message = "可使用人不能为空") + private List userIdList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java new file mode 100644 index 0000000..769f242 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateDetailResponse.java @@ -0,0 +1,77 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板详情响应实体 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@ApiModel +@Data +public class TemplateDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id", dataType = "Long", required = true) + private Long id; + + /** + * 模板编号 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板编号", dataType = "String") + private String templateNo; + + /** + * 模板名称 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板表名称", dataType = "String") + private String templateName; + + /** + * 原始记录模板或证书报告模板-字典code + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板-字典code", dataType = "String") + private String templateType; + + /** + * 模板描述 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板描述", dataType = "String") + private String templateDesc; + + /** + * 模板创建人 + */ + @ApiModelProperty(value = "原始记录模板/证书报告模板创建人", dataType = "String") + private String templateCreator; + + /** + * minio存储文件名 + */ + @ApiModelProperty(value = "上传文件返回文件名", dataType = "String") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间", dataType = "String") + private String createTime; + + /** + * 更新时间 + */ + @ApiModelProperty(hidden = true) + private String updateTime; + + @ApiModelProperty(value = "可使用人列表", dataType = "List") + private List userList; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java new file mode 100644 index 0000000..ffb7abd --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/TemplateListRequest.java @@ -0,0 +1,54 @@ +package com.casic.missiles.dto.system; + +import com.casic.missiles.dto.BaseSystemRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @Description: 原始记录模板列表请求实体 + * @Author: wangpeng + * @Date: 2022/12/1 17:32 + */ +@ApiModel +@Data +public class TemplateListRequest extends BaseSystemRequest { + /** + * 类型 + */ + @ApiModelProperty(value = "类型-字典code", dataType = "String", required = true) + @NotBlank(message = "类型不能为空") + private String templateType; + + /** + * 编号 + */ + @ApiModelProperty(value = "编号", dataType = "String") + private String templateNo; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称", dataType = "String") + private String templateName; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人", dataType = "String") + private String templateCreator; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间(开始)", dataType = "String") + private String createStartTime; + @ApiModelProperty(value = "创建时间(结束)", dataType = "String") + private String createEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java new file mode 100644 index 0000000..ff91232 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/UserClientDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.dto.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("app推送") +public class UserClientDTO { + + @ApiModelProperty(value = "客户端id", dataType = "String") + private String clientId; + + @ApiModelProperty(value = "关闭/启动", dataType = "Integer") + private Integer enable; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java new file mode 100644 index 0000000..ac68685 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupInfo.java @@ -0,0 +1,78 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组信息表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_info") +public class EquipmentGroupInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private Long id; + + /** + * 分组名称 + */ + @ApiModelProperty("分组名称") + @TableField("group_name") + private String groupName; + + /** + * 创建人id + */ + @ApiModelProperty("创建人id") + @TableField("create_user_id") + private Long createUserId; + + /** + * 创建人名字 + */ + @ApiModelProperty("创建人名字") + @TableField("create_user_name") + private String createUserName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java new file mode 100644 index 0000000..380d037 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentGroupRelation.java @@ -0,0 +1,76 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-设备分组关系表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_group_relation") +public class EquipmentGroupRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + @ApiModelProperty("分组id") + @TableField("group_id") + private Long groupId; + + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + @ApiModelProperty("统一编号") + @TableField(exist = false) + private String equipmentNo; + @ApiModelProperty("设备名称") + @TableField(exist = false) + private String equipmentName; + @ApiModelProperty("型号规格") + @TableField(exist = false) + private String model; + @ApiModelProperty("负责人") + @TableField(exist = false) + private String directorName; + @ApiModelProperty("计量标识") + @TableField(exist = false) + private String meterIdentify; + @ApiModelProperty("证书有效期") + @TableField(exist = false) + private Date certificateValid; + @ApiModelProperty("安装位置") + @TableField(exist = false) + private String installLocation; + @ApiModelProperty("安装位置扩展信息") + @TableField(exist = false) + private String installLocationExt; + + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java new file mode 100644 index 0000000..ce9a48b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/equipment/EquipmentSpecialCertificate.java @@ -0,0 +1,97 @@ +package com.casic.missiles.model.equipment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 受检设备-特种设备证书表 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Data +@TableName("eqpt_equipment_special_certificate") +public class EquipmentSpecialCertificate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId("id") + private Long id; + + /** + * 设备id + */ + @ApiModelProperty("设备id") + @TableField("equipment_id") + private Long equipmentId; + + /** + * 证书编号 + */ + @ApiModelProperty("证书编号") + @TableField("certificate_no") + private String certificateNo; + + /** + * 证书名称 + */ + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + /** + * 检定(校准)机构 + */ + @ApiModelProperty("检定(校准)机构") + @TableField("check_organization") + private String checkOrganization; + + /** + * 证书日期 + */ + @ApiModelProperty("证书日期") + @TableField("check_date") + private Date checkDate; + + /** + * 证书有效期 + */ + @ApiModelProperty("证书有效期") + @TableField("certificate_valid") + private LocalDateTime certificateValid; + + /** + * 证书附件(minio存储文件名) + */ + @ApiModelProperty("证书附件(minio存储文件名)") + @TableField("minio_file_name") + private String minioFileName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @ApiModelProperty("更新时间") + @TableField("update_time") + private Date updateTime; + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java new file mode 100644 index 0000000..6aa114d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupInfoService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.service.equipment; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; + +/** + *

+ * 受检设备-设备分组信息表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupInfoService extends IService { + + boolean addGroup(EquipmentGroupForm groupForm); + + boolean updateGroup(EquipmentGroupForm groupForm); + + boolean deleteGroup(Long groupId); + + Page listPage(Page page, String groupName); + + EquipmentGroupForm detail(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java new file mode 100644 index 0000000..e734f6f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentGroupRelationService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentGroupRelationService extends IService { + + boolean deleteByGroupId(Long groupId); + + List listByGroup(Long groupId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java new file mode 100644 index 0000000..57c373f --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentSpecialCertificateService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 受检设备-特种设备证书表 服务类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +public interface IEquipmentSpecialCertificateService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java new file mode 100644 index 0000000..8d45b5b --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupInfoServiceImpl.java @@ -0,0 +1,89 @@ +package com.casic.missiles.service.impl.equipment; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.equipment.EquipmentGroupForm; +import com.casic.missiles.mapper.equipment.EquipmentGroupInfoMapper; +import com.casic.missiles.model.equipment.EquipmentGroupInfo; +import com.casic.missiles.service.equipment.IEquipmentGroupInfoService; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

+ * 受检设备-设备分组信息表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +@RequiredArgsConstructor +public class EquipmentGroupInfoServiceImpl extends ServiceImpl implements IEquipmentGroupInfoService { + + private final IEquipmentGroupRelationService groupRelationService; + + @Override + @Transactional + public boolean addGroup(EquipmentGroupForm groupForm) { + boolean res = this.save(groupForm.getGroupInfo()); + if(res && CollUtil.isNotEmpty(groupForm.getEquipmentList())){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + return res; + } + + @Override + @Transactional + public boolean updateGroup(EquipmentGroupForm groupForm) { + boolean res = this.updateById(groupForm.getGroupInfo()); + if(res){ + res = groupRelationService.deleteByGroupId(groupForm.getGroupInfo().getId()); + if(res){ + groupForm.getEquipmentList().forEach(i->{ + i.setGroupId(groupForm.getGroupInfo().getId()); + }); + res = groupRelationService.saveBatch(groupForm.getEquipmentList()); + } + } + return res; + } + + @Override + @Transactional + public boolean deleteGroup(Long groupId) { + boolean res = this.removeById(groupId); + if(res){ + res = groupRelationService.deleteByGroupId(groupId); + } + return res; + } + + @Override + public Page listPage(Page page,String groupName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(groupName)){ + queryWrapper.like("group_name",groupName); + } + return this.page(page,queryWrapper); + } + + @Override + public EquipmentGroupForm detail(Long groupId) { + EquipmentGroupForm groupForm = new EquipmentGroupForm(); + + EquipmentGroupInfo groupInfo = this.getById(groupId); + groupForm.setGroupInfo(groupInfo); + + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java new file mode 100644 index 0000000..6072bea --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentGroupRelationServiceImpl.java @@ -0,0 +1,34 @@ +package com.casic.missiles.service.impl.equipment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.model.equipment.EquipmentGroupRelation; +import com.casic.missiles.mapper.equipment.EquipmentGroupRelationMapper; +import com.casic.missiles.service.equipment.IEquipmentGroupRelationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 受检设备-设备分组关系表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentGroupRelationServiceImpl extends ServiceImpl implements IEquipmentGroupRelationService { + + @Override + public boolean deleteByGroupId(Long groupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("group_id",groupId); + return this.remove(queryWrapper); + } + + @Override + public List listByGroup(Long groupId) { + return null; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java new file mode 100644 index 0000000..d57c72d --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentSpecialCertificateServiceImpl.java @@ -0,0 +1,21 @@ +package com.casic.missiles.service.impl.equipment; + +import com.casic.missiles.model.equipment.EquipmentSpecialCertificate; +import com.casic.missiles.mapper.equipment.EquipmentSpecialCertificateMapper; +import com.casic.missiles.service.equipment.IEquipmentSpecialCertificateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 受检设备-特种设备证书表 服务实现类 + *

+ * + * @author zhangyingjie + * @since 2023-07-26 + */ +@Service +public class EquipmentSpecialCertificateServiceImpl extends ServiceImpl implements IEquipmentSpecialCertificateService { + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java new file mode 100644 index 0000000..c32a999 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/DownloadCenterServiceImpl.java @@ -0,0 +1,156 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.enums.ExportEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemFileConfigMapper; +import com.casic.missiles.model.system.SystemFileConfig; +import com.casic.missiles.service.system.IDownloadCenterService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.MinioUtil; +import com.casic.missiles.utils.NumberGeneratorUtil; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +@Service +@AllArgsConstructor +public class DownloadCenterServiceImpl extends ServiceImpl implements IDownloadCenterService { + + private final MinioUtil minioUtil; + private final IBaseExportService iBaseExportService; + + @Override + public Page listPage(Page page, DownloadListRequest request) throws Exception { + QueryWrapper queryWrapper = getWrapper(request); + Page downloadListResponsePage = PageFactory.defaultPage(); + Page downloadCenterPage = this.baseMapper.selectPage(page, queryWrapper); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(downloadCenterPage.getRecords(), DownloadListResponse.class)); + for (DownloadListResponse customerInfo : downloadListResponsePage.getRecords()) { + DictCodeUtils.convertDictCodeToName(customerInfo); + } + return downloadListResponsePage; + } + + @Override + public void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception { + Page page = PageFactory.defaultPage(); + Page downloadListResponsePage = PageFactory.defaultPage(); + if (!CollectionUtils.isEmpty(request.getIds())) { + List downloadCenterPage = this.baseMapper.selectBatchIds(request.getIds()); + page.setRecords(downloadCenterPage); + downloadListResponsePage.setRecords(ConvertUtils.sourceToTarget(page.getRecords(), DownloadListResponse.class)); + } else { + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + request.setIds(null); + downloadListResponsePage = listPage(page, request); + } + iBaseExportService.exportExcel(response, DownloadListResponse.class, downloadListResponsePage.getRecords(), ExportEnum.DOWNLOAD_TEMPLATE.getSheetName()); + } + + @Override + public ReturnDTO addDownloadFile(SystemFileConfig downloadCenter) { + initDownloadFile(downloadCenter); + int addFlag = this.baseMapper.insert(downloadCenter); + if (addFlag > 0) { + return ReturnUtil.success(); + } + return null; + } + + /** + * 查询,删除之前的文件 + * 上传新的文件 + */ + @Override + public ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter) { + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setUpdateUser(authUser.getId()); + int updateFlag = this.baseMapper.updateById(downloadCenter); + if (updateFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public SystemFileConfig downloadFileDetail(Long id) { + SystemFileConfig downloadCenter = this.baseMapper.selectById(id); + return downloadCenter; + } + + @Override + public ReturnDTO deleteDownloadFile(Long id) { + int deleteFlag = this.baseMapper.deleteById(id); + if (deleteFlag > 0) { + return ReturnUtil.success(); + } + return ReturnUtil.failed("删除失败"); + } + + @Override + public ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest) { + if (StringUtils.isEmpty(downloadFileRequest.getFileName())) { + downloadFileRequest.setFileName(this.baseMapper.getFileNameByBusiness(downloadFileRequest)); + } + ResponseEntity download = minioUtil.download(downloadFileRequest.getFileName()); + return ReturnUtil.success(download); + } + + private QueryWrapper getWrapper(DownloadListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.like(StringUtils.isNotBlank(request.getDownloadNo()), "download_no", request.getDownloadNo()); + wrapper.like(StringUtils.isNotBlank(request.getModuleName()), "module_name", request.getModuleName()); + wrapper.like(StringUtils.isNotBlank(request.getFileName()), "file_name", request.getFileName()); + wrapper.like(StringUtils.isNotBlank(request.getFileType()), "file_type", request.getFileType()); + wrapper.apply(StringUtils.isNotBlank(request.getStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getStartTime()); + wrapper.apply(StringUtils.isNotBlank(request.getEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getEndTime()); + wrapper.orderByDesc("update_time"); + return wrapper; + } + + private void initDownloadFile(SystemFileConfig downloadCenter) { + Long maxNo = this.baseMapper.selectMaxFileNo(); + //版本号不为空,设置累加次数 + if (StringUtils.isNotEmpty(downloadCenter.getVersionName())) { + Long maxVersionCode = this.baseMapper.selectMaxVersionNo(); + downloadCenter.setVersionCode(++maxVersionCode); + } + String downloadNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.DOWNLOAD_NO, maxNo); + AuthUser authUser = ShiroKit.getUser(); + downloadCenter.setCreateUser(authUser.getId()); + downloadCenter.setUpdateUser(authUser.getId()); + downloadCenter.setDownloadNo(downloadNo); + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java new file mode 100644 index 0000000..1e453cb --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -0,0 +1,848 @@ +package com.casic.missiles.service.impl.system; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; +import com.casic.missiles.enums.system.AssigneeTypeEnum; +import com.casic.missiles.mapper.system.FlowDefMapper; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.RuRelation; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.IUserRoleRelationService; +import com.casic.missiles.service.system.IFlowDefService; +import com.casic.missiles.utils.SnowflakeUtil; +import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.BpmnAutoLayout; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:08 + */ +@Slf4j +@Service +public class FlowDefDefServiceImpl implements IFlowDefService { + @Resource + private SnowflakeUtil snowflakeUtil; + @Resource + private FlowDefMapper flowDefMapper; + @Resource + private SystemFlowFormMapper flowFormMapper; + @Resource + private RepositoryService repositoryService; + + @Override + @Transactional + public ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //bpmn对象(可与xml相互转化) + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //流程定义-添加流程id + process.setId("flowableV2_" + snowflakeUtil.nextId()); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + //流程定义-添加流程名称 + process.setName(name); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); + System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category("")//自定义类别 + .deploy(); + log.info("流程定义部署,flowable return deploy:{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.failed("流程定义部署失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setSystemType(2);//受检设备管理系统 + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setProcDefId(process.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + //已设置form_id主键索引 + if (flowFormMapper.insert(systemFlowForm) <= 0) { + //新增失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存失败"); + } + } catch (DuplicateKeyException e) { + log.error("该表单已保存过流程定义,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常,该表单已存在流程定义"); + } catch (Exception e) { + log.error("流程定义保存异常,异常信息:{}", e.getMessage()); + //新增异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义保存异常"); + } + return ReturnUtil.success("流程定义保存成功"); + } + + @Override + public List listPage(Page page, FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployListPage(page, request); + return dataList; + } + + @Override + @Transactional + public ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException { + //根据jsonObject中process的id更新流程定义的信息,流程id相同flowable会增加一个新版本的流程定义 + BpmnModel bpmnModel = new BpmnModel(); + //流程定义对象 + Process process = new Process(); + //添加流程定义到bpmn对象 + bpmnModel.addProcess(process); + //流程中连线 + List sequenceFlows = Lists.newArrayList(); + //启动事件 + StartEvent startEvent = createStartEvent(); + //流程定义-添加启动事件 + process.addFlowElement(startEvent); + //获取json实体 + JSONObject workFlowObj = jsonObject.getJSONObject("_value"); + //流程定义-获取流程id + String id = workFlowObj.getJSONObject("workFlowDef").getString("flowKey"); + process.setId(id); + String name = workFlowObj.getJSONObject("workFlowDef").getString("name"); + String directorId = workFlowObj.getJSONObject("workFlowDef").getString("directorId"); + //流程定义-添加流程名称 + process.setName(name); + //流程定义-添加扩展属性 + ExtensionAttribute extensionAttribute = new ExtensionAttribute(); + extensionAttribute.setName("Casic"); + extensionAttribute.setNamespace("http://flowable.org/bpmn"); + extensionAttribute.setValue(jsonObject.toJSONString()); + process.addAttribute(extensionAttribute); + //流程定义-添加节点 + JSONObject processNodes = workFlowObj.getJSONObject("nodeConfig"); + String lastNode = create(startEvent.getId(), processNodes, bpmnModel, process, sequenceFlows); + EndEvent endEvent = createEndEvent(); + process.addFlowElement(endEvent); + process.addFlowElement(connect(lastNode, endEvent.getId(), sequenceFlows)); + + //重新布局,自动生成布局,布局节点位置 + new BpmnAutoLayout(bpmnModel).execute(); +// System.err.println(new String(new BpmnXMLConverter().convertToXML(bpmnModel))); + +// ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory(); +// ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator(); +// //验证失败信息的封装ValidationError +// List validate = defaultProcessValidator.validate(bpmnModel); +// log.info("更新流程定义,jsonToBpmn获取到的流程定义验证信息为:{}", validate); +// if (!CollectionUtils.isEmpty(validate)) { +// throw new RuntimeException("流程有误,请检查后重试"); +// } + + //流程部署,更新 + Deployment deploy = repositoryService.createDeployment() + .tenantId(directorId)//租户标识符,这是一个字符串,可以是UUID、部门id + .addBpmnModel(name + ".bpmn", bpmnModel) + .name(name) +// .category() + .deploy(); + log.info("流程定义部署更新,flowable return deploy;{}", JSONObject.toJSONString(deploy)); + if (Objects.isNull(deploy)) { + return ReturnUtil.success("流程定义更新失败"); + } + + //存储流程定义jsonObject,用于详情展示 + SystemFlowForm systemFlowForm = new SystemFlowForm(); + systemFlowForm.setFormId(workFlowObj.getString("formId")); + systemFlowForm.setDeployId(deploy.getId()); + systemFlowForm.setFormName(workFlowObj.getString("formName")); + systemFlowForm.setFormContent(workFlowObj.getString("formContent")); + systemFlowForm.setFormDesc(workFlowObj.getString("formDesc")); + systemFlowForm.setFlowDef(workFlowObj.toJSONString()); + try { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("form_id", workFlowObj.getString("formId")); + if (flowFormMapper.update(systemFlowForm, wrapper) <= 0) { + //更新失败则删除刚部署的流程 + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新失败"); + } + } catch (Exception e) { + log.error("流程定义更新异常,异常信息:{}", e.getMessage()); + //更新异常则删除刚部署的流程 + repositoryService.deleteDeployment(deploy.getId(), true); + return ReturnUtil.failed("流程定义更新异常"); + } + return ReturnUtil.success("流程定义更新成功"); + } + + @Override + public ReturnDTO detail(String formId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm systemFlowForm = flowFormMapper.selectOne(wrapper); + if (!Objects.isNull(systemFlowForm)) { + return ReturnUtil.success(JSONObject.parseObject(systemFlowForm.getFlowDef())); + } + return ReturnUtil.failed("流程定义详情获取失败,无该流程定义"); + } + + @Override + public ReturnDTO updateState(FlowUpdateStateRequest request) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(request.getDeployId()).singleResult(); + // 激活 + if (1 == request.getState()) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (2 == request.getState()) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + return ReturnUtil.success(); + } + + @Override + @Transactional + public ReturnDTO delete(FlowDeleteRequest request) { + //流程定义表单表删除 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("deploy_id", request.getDeployId()); + if (flowFormMapper.delete(wrapper) <= 0) { + log.error("流程定义删除失败,deployId:{}", request.getDeployId()); + return ReturnUtil.failed("流程定义删除失败"); + } + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + return ReturnUtil.success(); + } + + @Override + public List list(FlowListRequest request) { + //查询关联表单表、表单关联部署表、用户表、流程定义表、流程部署表 + List dataList = flowDefMapper.selectDeployList(request); + return dataList; + } + + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + + + /** + * 方法功能:根据上个节点id及本节点信息生成本节点 + * + * @param fromId:启动事件id + * @param flowNode:所有节点树形结构 + * @param model:bpmn对象(最终要得到的结果) + * @param process:流程定义 + * @param sequenceFlows:连线列表 + */ + private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //获取节点类型,0 发起人 1审批 2抄送 3条件 4路由 + Integer nodeType = flowNode.getInteger("type"); + //节点类型-并行网关 + if (Type.PARALLEL.type.equals(nodeType)) { + return createParallelGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-路由 + else if (Type.ROUTER.type.equals(nodeType)) { + return createExclusiveGatewayBuilder(fromId, flowNode, model, process, sequenceFlows); + } + //节点类型-发起人(根节点) + else if (Type.ROOT.type.equals(nodeType)) { + //添加incoming属性(表示进来的,即上面流程节点的id列表),值为仅一个启动事件id的列表 + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-抄送任务 + else if (Type.CC.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createServiceTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } + //节点类型-用户审批任务 + else if (Type.USER_TASK.type.equals(nodeType)) { + flowNode.put("incoming", Collections.singletonList(fromId)); + String id = createTask(flowNode, process, sequenceFlows); + // 如果当前任务还有后续任务,则遍历创建后续任务 + JSONObject nextNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(nextNode)) { + FlowElement flowElement = model.getFlowElement(id); + return create(id, nextNode, model, process, sequenceFlows); + } else { + return id; + } + } else { + throw new RuntimeException("未知节点类型: nodeType=" + nodeType); + } + } + + /** + * 排他网关分支上有条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createExclusiveGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + String name = flowNode.getString("nodeName"); + String exclusiveGatewayId = id("exclusiveGateway"); + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(exclusiveGatewayId); + exclusiveGateway.setName(name); + process.addFlowElement(exclusiveGateway); + process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows)); + + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return exclusiveGatewayId; + } + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + + List conditions = Lists.newCopyOnWriteArrayList(); + ///为每个排他网关的条件节点的子节点添加后续节点(相比于并行网关多了连线的条件表达式设置) + for (JSONObject element : flowNodes) { + //一个分支的子节点 + JSONObject childNode = element.getJSONObject("childNode"); + //一个分支的名字和表达式 + String nodeName = element.getString("nodeName"); + String expression = ""; + expression = element.getString("conditionExpression"); + if (StringUtils.isEmpty(expression)) { + JSONArray nodeUserList = element.getJSONArray("nodeUserList"); + //1具体人员 2角色 3部门 + //构造条件表达式 + Iterator iterator = nodeUserList.stream().iterator(); + List userIds = new ArrayList<>(); + while (iterator.hasNext()) { + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if (AssigneeTypeEnum.USER.equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if (AssigneeTypeEnum.ROLE.equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if (AssigneeTypeEnum.DEPT.equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); + } + } + String str = StringUtils.join(userIds, ","); + // 以下已测试成功 + // ExUtils为bean实例方法,已添加 + // flowable表达式会自动识别流程变量,以下root也可识别为实例创建时的具体值,比如:${price < 100},price就是一个流程变量的值,UEL表达式的结果为布尔值 + String starterId = "root"; + if(StringUtils.isEmpty(str)){ + //其他条件(最后一个分支为空条件的情况) + expression = "#{exUtils." + "strContains(" + starterId + "," + starterId + ")}"; + }else { + expression = "#{exUtils." + "strContains(" + starterId + "," + str + ")}"; + } + } + + if (Objects.isNull(childNode)) { + //条件节点下无子节点,设置后续节点的fromId为exclusiveGatewayId(即排他网关的id,多个分支的排他网关id相同,名字和表达式不同) + incoming.add(exclusiveGatewayId); + JSONObject condition = new JSONObject(); + condition.fluentPut("nodeName", nodeName) + .fluentPut("expression", expression); + conditions.add(condition); + continue; + } + // 只生成一个任务,同时设置当前任务的条件 + childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); + String identifier = create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + //连线列表中前一个节点是exclusiveGatewayId的连线,给每个连线设置名称和表达式 + //使用forEach是因为前一个节点是exclusiveGatewayId的节点有很多,需要遍历为没赋值过的赋值 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) + .collect(Collectors.toList()); + for (SequenceFlow e : flows) { + //设置连线名为条件节点名 + if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { + e.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + e.setConditionExpression(expression); + } + } + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个排他网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + + if (Objects.nonNull(childNode)) { + //有条件分支但无条件节点对应的子节点 + if (incoming == null || incoming.isEmpty()) { + return create(exclusiveGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end exclusive gateway + //条件分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行边连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + //当前网关的结束网关 + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + childNode.put("childNode", null); + String identifier = endExId; + for (int i = 0; i < incoming.size(); i++) { + // TODO: 2022/12/5 此处用的connect第一个参数和并行网关的为啥不一样 + // TODO: 2022/12/5 为啥有后续节点这里却设置成了endExId + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + //顺序无所谓,都是分支上一个条件的分支 + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + + conditions.remove(0); + } + }); + + } + + // 1.1 边连接完成后,在进行 nextNode 创建 + if (Objects.nonNull(childNode)) { + return create(endExId, childNode, model, process, sequenceFlows); + } else { + return endExId; + } + } + } else { + // 所有 service task 连接 end exclusive gateway + // 1.0 先进行边连接, 暂存 nextNode + String endExId = id("exclusiveGateway") + "end"; + process.addFlowElement(createExclusiveGateWayEnd(endExId)); + String identifier = endExId; + //其他条件分支和第一个条件分支连线的终点节点相同 + for (int i = 0; i < incoming.size(); i++) { + process.addFlowElement(connect(incoming.get(i), endExId, sequenceFlows)); + } + // 针对 gateway 空任务分支 添加条件表达式,即条件节点下无子节点的情况 + if (!conditions.isEmpty()) { + FlowElement flowElement1 = model.getFlowElement(identifier); + // 获取从 gateway 到目标节点 未设置条件表达式的节点 + List flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) + .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) + .collect(Collectors.toList()); + flows.stream().forEach(sequenceFlow -> { + if (!conditions.isEmpty()) { + JSONObject condition = conditions.get(0); + String nodeName = condition.getString("nodeName"); + String expression = condition.getString("expression"); + + if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { + sequenceFlow.setName(nodeName); + } + // 设置条件表达式 + if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { + sequenceFlow.setConditionExpression(expression); + } + conditions.remove(0); + } + }); + + } + return endExId; + } + } + + /** + * 并行网关分支上无条件设置 + * + * @param formId + * @param flowNode + * @param model + * @param process + * @param sequenceFlows + * @return 返回创建的节点的id标识 + */ + private static String createParallelGatewayBuilder(String formId, JSONObject flowNode, BpmnModel model, Process process, List sequenceFlows) throws InvocationTargetException, IllegalAccessException { + //并行网关节点名 + String name = flowNode.getString("nodeName"); + ParallelGateway parallelGateway = new ParallelGateway(); + String parallelGatewayId = id("parallelGateway"); + parallelGateway.setId(parallelGatewayId); + parallelGateway.setName(name); + process.addFlowElement(parallelGateway); + //与上个节点的连线 + process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows)); + //1、无条件节点和子节点 + if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { + return parallelGatewayId; + } + //2、有条件节点或子节点 + //获取条件节点 + List flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); + //每个分支上的最后节点的标识id,用于给整个并行网关的子节点提供fromId + List incoming = Lists.newArrayListWithCapacity(flowNodes.size()); + //为每个并行网关的条件节点的子节点添加后续节点 + for (JSONObject element : flowNodes) { + JSONObject childNode = element.getJSONObject("childNode"); + if (Objects.isNull(childNode)) { + incoming.add(parallelGatewayId); + continue; + } + String identifier = create(parallelGatewayId, childNode, model, process, sequenceFlows); + if (Objects.nonNull(identifier)) { + incoming.add(identifier); + } + } + //当前网关节点的子节点(整个并行网关的子节点) + JSONObject childNode = flowNode.getJSONObject("childNode"); + if (Objects.nonNull(childNode)) { + // 普通结束网关 + //有并行分支但无条件节点对应的子节点 + if (CollectionUtils.isEmpty(incoming)) { + return create(parallelGatewayId, childNode, model, process, sequenceFlows); + } else { + // 所有 service task 连接 end parallel gateway + //并行分支汇合到下面的childNode节点 + childNode.put("incoming", incoming); + FlowElement flowElement = model.getFlowElement(incoming.get(0)); + // 1.0 先进行线连接, 暂存 nextNode + JSONObject nextNode = childNode.getJSONObject("childNode"); + childNode.put("childNode", null); + String identifier = create(incoming.get(0), childNode, model, process, sequenceFlows); + //其他并行分支和第一个并行分支连线的终点节点相同 + for (int i = 1; i < incoming.size(); i++) { + FlowElement flowElement1 = model.getFlowElement(incoming.get(i)); + process.addFlowElement(connect(flowElement1.getId(), identifier, sequenceFlows)); + } + // 1.1 线连接完成后,再进行 nextNode 创建 + if (Objects.nonNull(nextNode)) { + return create(identifier, nextNode, model, process, sequenceFlows); + } else { + return identifier; + } + } + } + return parallelGatewayId; + } + + //流转到服务任务(serviceTask)节点时会自动执行某些操作然后向下流转 + private static String createServiceTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + // 自动生成id + String id = id("serviceTask"); + if (incoming != null && !incoming.isEmpty()) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(flowNode.getString("nodeName")); + serviceTask.setId(id); + process.addFlowElement(serviceTask); + // TODO: 2023/2/16 抄送实现,需求可不做 +// serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); +// serviceTask.setImplementation("实现JavaDelegate接口的类路径"); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private static String createTask(JSONObject flowNode, Process process, List sequenceFlows) { + List incoming = null; + if(!Objects.isNull(flowNode.getJSONArray("incoming"))){ + incoming = flowNode.getJSONArray("incoming").toJavaList(String.class); + } + String id = ""; + if (incoming != null && !incoming.isEmpty()) { + UserTask userTask = new UserTask(); + userTask.setName(flowNode.getString("nodeName")); + + //设置监听器 + ArrayList taskListeners = new ArrayList<>(); + FlowableListener taskListener = new FlowableListener(); + // 事件类型 + taskListener.setEvent(TaskListener.EVENTNAME_CREATE); + // 监听器类型 + taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + taskListener.setImplementation("${taskCreatedListener}"); + taskListeners.add(taskListener); + userTask.setTaskListeners(taskListeners); + //根节点 + if (Type.ROOT.type.equals(flowNode.getInteger("type"))) { + //设置root的id保证TaskCreatedListener的第一个if条件完成,从而能执行CounterSignListener + id = id("root"); + } + //用户审批任务节点 + else { + id = id("userTask"); + //设置监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener flowableListener = new FlowableListener(); + // 事件类型 + flowableListener.setEvent(ExecutionListener.EVENTNAME_START); + // 监听器类型 + flowableListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean. + flowableListener.setImplementation("${counterSignListener}"); + listeners.add(flowableListener); + userTask.setExecutionListeners(listeners); + + //多实例,在业务流程中,为特定步骤定义重复的方式 + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + String examineMode = flowNode.getString("examineMode"); + // 审批人集合参数,会签集合变量名称,flowable:collection=“id+assigneeList” + //collection 赋值使用原因: + // 通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。 + // 就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人) + multiInstanceLoopCharacteristics.setInputDataItem(id + "assigneeList"); + // 迭代集合,会签集合遍历名称(集合每个元素的标识) + multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); + // 并行,配置会签节点人员办理顺序 串行:true 并行:false + multiInstanceLoopCharacteristics.setSequential(false); + // 设置下一节点处理人表达式,flowable:assignee=“${assigneeName}”(上面集合每个元素的标识的实际使用) + userTask.setAssignee("${assigneeName}"); + // 设置多实例属性,多实例:会签情况下每个处理人对应一个实例 + userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics); + //多人审批时采用的审批方式 1依次会签 2并行会签 3或签 + //默认并行会签,会签的实例存ACT_RU_IDENTITYLINK表,串行时表中会依次增加实例数据 + if ("1".equals(examineMode)) { + multiInstanceLoopCharacteristics.setSequential(true); + } else if ("3".equals(examineMode)) { + //或签,即设置完成条件nrOfCompletedInstances/nrOfInstances > 0 + //nrOfCompletedInstances:已完成的实例数量,nrOfInstances:实例总数 + multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}"); + } + } + flowNode.put("id", id); + userTask.setId(id); + process.addFlowElement(userTask); + process.addFlowElement(connect(incoming.get(0), id, sequenceFlows)); + } + return id; + } + + private enum Type { + //0 发起人 1审批任务 2抄送任务 4条件路由 5并行网关 + ROOT(0, UserTask.class), + USER_TASK(1, UserTask.class), + CC(2, ServiceTask.class), + ROUTER(4, ExclusiveGateway.class), + PARALLEL(5, ParallelGateway.class), + SERVER_TASK(6, UserTask.class); + + private Integer type; + private Class typeClass; + + Type(Integer type, Class typeClass) { + this.type = type; + this.typeClass = typeClass; + } + + public final static Map> TYPE_MAP = Maps.newHashMap(); + + static { + for (Type element : Type.values()) { + TYPE_MAP.put(element.type, element.typeClass); + } + } + + public boolean isEqual(String type) { + return this.type.equals(type); + } + } + + + private static String id(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } + + private static ServiceTask serviceTask(String name) { + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName(name); + return serviceTask; + } + + /** + * 新建连线实体加入连线列表 + */ + protected static SequenceFlow connect(String from, String to, List sequenceFlows) { + SequenceFlow flow = new SequenceFlow(); + flow.setId(id("sequenceFlow")); + flow.setSourceRef(from); + flow.setTargetRef(to); + sequenceFlows.add(flow); + return flow; + } + + protected static StartEvent createStartEvent() { + StartEvent startEvent = new StartEvent(); + startEvent.setId(id("start")); + startEvent.setInitiator("applyUserId"); + return startEvent; + } + + protected static EndEvent createEndEvent() { + EndEvent endEvent = new EndEvent(); + endEvent.setId(id("end")); + // 事件结束监听器 + ArrayList listeners = new ArrayList<>(); + FlowableListener listener = new FlowableListener(); + // 结束节点开始时 + listener.setEvent((ExecutionListener.EVENTNAME_START)); + // 监听器类型 + listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + listener.setImplementation("${processUpdateStateListener}"); + listeners.add(listener); + endEvent.setExecutionListeners(listeners); + return endEvent; + } + + public static ExclusiveGateway createExclusiveGateWayEnd(String id) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(id); + return exclusiveGateway; + } + + private static ParallelGateway createParallelGateWayEnd(String id) { + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(id); + return parallelGateway; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java new file mode 100644 index 0000000..efe17f0 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemFlowFormServiceImpl.java @@ -0,0 +1,79 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.casic.missiles.mapper.system.SystemFlowFormMapper; +import com.casic.missiles.model.system.SystemFlowForm; +import com.casic.missiles.modular.system.dao.DeptMapper; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemFlowFormService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +@Service +public class SystemFlowFormServiceImpl extends ServiceImpl implements ISystemFlowFormService { + @Resource + private UserMapper userMapper; + @Resource + private DeptMapper deptMapper; + + @Override + public int getDirectorLevel(Long userId) { + //需要保证用户所在组织机构一定要有个角色的TIPS为director的角色的人 + int level = 0; + return getDirectorList(level, userId); + } + + private int getDirectorList(int level, Long userId) { + User user = userMapper.selectById(userId); + Long deptId = user.getDeptId(); + Dept dept = deptMapper.selectById(deptId); + String pids = dept.getPids(); + List deptIds = new ArrayList<>(); + if(StringUtils.isNotEmpty(pids)){ + String replace = pids.replace("[", "").replace("]", ""); + pids = replace.substring(0, replace.length() - 1); + //在角色管理中配置的角色所在组织机构,要保证该机构的子组织结构使用该角色也可以生效 + deptIds = new ArrayList<>(Arrays.asList(pids.split(","))); + } + if(level >= 1){ + //主管获取所在的上级部门 + deptId = dept.getPid(); + } + //保证无父id时deptIds有值,sql正常执行 + if(CollectionUtils.isEmpty(deptIds)){ + deptIds.add(String.valueOf(deptId)); + } + List> list = SqlRunner.db().selectList("select su.ID as id from sys_role sr " + + "JOIN sys_ru_relation srr ON sr.ID = srr.ROLEID " + + "JOIN sys_user su ON srr.USERID = su.ID " + + "WHERE (sr.DEPT_ID = {2} or sr.DEPT_ID in {0})" +//角色所在的组织机构及该结构的子结构 + "AND sr.TIPS = {1}" + + "AND su.DEPT_ID = {2}", deptIds, "director", String.valueOf(deptId)); + + if(CollectionUtils.isEmpty(list)){ + return level; + } + level += 1; + Map idMap = list.get(0); + String id = String.valueOf(idMap.get("id")); + return getDirectorList(level, Long.valueOf(id)); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java new file mode 100644 index 0000000..f6ed280 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeServiceImpl.java @@ -0,0 +1,106 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.mapper.system.SystemNoticeMapper; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNotice; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeService; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 系统管理-通知公告表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +@Service +public class SystemNoticeServiceImpl extends ServiceImpl implements ISystemNoticeService { + @Autowired + private SystemNoticeMapper noticeMapper; + @Autowired + private ISystemNoticeUserRelationService noticeUserRelationService; + @Autowired + private SystemNoticeUserRelationMapper noticeUserRelationMapper; + + @Override + public Page listPage(Page page, NoticeListRequest request) { + AuthUser user = ShiroKit.getUser(); + if(!Objects.isNull(user)){ + request.setUserId(user.getId()); + } + Page noticePage = noticeMapper.selectListPage(page, request); + return noticePage; + } + + @Override + public ReturnDTO addNotice(NoticeAddRequest noticeAddRequest) { + //生成编号 + Long maxNo = noticeMapper.selectMaxNoticeNo(); + String noticeNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.NOTICE_PREFIX, maxNo); + noticeAddRequest.setNoticeNo(noticeNo); + SystemNotice systemNotice = ConvertUtils.sourceToTarget(noticeAddRequest, SystemNotice.class); + int insertFlag = noticeMapper.insert(systemNotice); + if(insertFlag <= 0){ + return ReturnUtil.failed("新建失败"); + } + return ReturnUtil.success(); + } + + @Override + public ReturnDTO updateNotice(SystemNotice systemNotice) { + int updateFlag = noticeMapper.updateById(systemNotice); + if(updateFlag > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteNotice(Long id) { + if(noticeMapper.deleteById(id) > 0){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("notice_id", id); + noticeUserRelationMapper.delete(wrapper); + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest) { + Long userId = noticeReadRequest.getUserId(); + List ids = noticeReadRequest.getIds(); + List list = new ArrayList<>(); + ids.forEach(id -> { + SystemNoticeUserRelation noticeUserRelation = new SystemNoticeUserRelation(); + noticeUserRelation.setUserId(userId); + noticeUserRelation.setNoticeId(id); + list.add(noticeUserRelation); + }); + if(noticeUserRelationService.saveBatch(list)){ + return ReturnUtil.success(); + } + return ReturnUtil.failed(); + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java new file mode 100644 index 0000000..729b695 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemNoticeUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemNoticeUserRelationMapper; +import com.casic.missiles.model.system.SystemNoticeUserRelation; +import com.casic.missiles.service.system.ISystemNoticeUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务实现类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +@Service +public class SystemNoticeUserRelationServiceImpl extends ServiceImpl implements ISystemNoticeUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java new file mode 100644 index 0000000..7f495f6 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignServiceImpl.java @@ -0,0 +1,168 @@ +package com.casic.missiles.service.impl.system; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.model.auth.AuthUser; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemSignMapper; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSign; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.modular.system.dao.UserMapper; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignServiceImpl extends ServiceImpl implements ISystemSignService { + @Autowired + private SystemSignMapper signMapper; + @Autowired + private ISystemSignUserRelationService userRelationService; + @Autowired + private SystemSignUserRelationMapper userRelationMapper; + @Autowired + private UserMapper userMapper; + + @Override + public Page listPage(Page page, SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page signPage = signMapper.selectPage(page, wrapper); + return signPage; + } + + @Override + public List list(SignListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return signMapper.selectList(wrapper); + } + + @Override + public ReturnDTO signDetail(Long id) { + SignDetailResponse signDetailResponse = signMapper.selectSignDetailById(id); + if(!Objects.isNull(signDetailResponse.getSignUserId())){ + User user = userMapper.selectById(signDetailResponse.getSignUserId()); + signDetailResponse.setSignUserName(user.getName()); + } + return ReturnUtil.success(signDetailResponse); + } + + @Override + @Transactional + public ReturnDTO addSign(SignAddRequest request) { + //生成编号 + Long maxNo = signMapper.selectMaxSignNo(); + String signNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.SIGN_PREFIX, maxNo); //签名签章编号一起 + SystemSign systemSign = ConvertUtils.sourceToTarget(request, SystemSign.class); + systemSign.setSignNo(signNo); + int insertFlag = signMapper.insert(systemSign); + //关联表 + //签名/签章可使用人 + List userIdList = request.getUserIdList(); + userIdList.add(request.getSignUserId()); //添加签名本人 + List userRelationList = getUserRelations(userIdList, systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + } + + @Override + @Transactional + public ReturnDTO updateSign(SystemSign systemSign) { + int updateFlag = signMapper.updateById(systemSign); + //关联表 + //签名/签章可使用人 + Map columnMap = new HashMap<>(); + columnMap.put("sign_id", systemSign.getId()); + int deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userIdList = systemSign.getUserIdList(); + userIdList.add(systemSign.getSignUserId()); + List userRelationList = getUserRelations(systemSign.getUserIdList(), systemSign.getId()); + boolean saveBatch = userRelationService.saveBatch(userRelationList); + + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteSign(Long id) { + if(signMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("刪除失败"); + } + + @Override + public ReturnDTO deleteBatchSign(List ids) { + if(signMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public List usableSign() { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + return signMapper.selectUsableSignList(user.getId()); + } + + private List getUserRelations(List userIdList, Long signId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemSignUserRelation userRelation = new SystemSignUserRelation(); + userRelation.setSignId(signId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(SignListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("sign_type", request.getSignType()); + wrapper.like(StringUtils.isNotBlank(request.getSignNo()), "sign_no", request.getSignNo()); + wrapper.like(StringUtils.isNotBlank(request.getSignName()), "sign_name", request.getSignName()); + wrapper.like(StringUtils.isNotBlank(request.getSignDirector()), "sign_director", request.getSignDirector()); + wrapper.eq(!Objects.isNull(request.getSignUserId()), "sign_user_id", request.getSignUserId()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java new file mode 100644 index 0000000..3cde6d5 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemSignUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemSignUserRelationMapper; +import com.casic.missiles.model.system.SystemSignUserRelation; +import com.casic.missiles.service.system.ISystemSignUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemSignUserRelationServiceImpl extends ServiceImpl implements ISystemSignUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java new file mode 100644 index 0000000..d6de776 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateServiceImpl.java @@ -0,0 +1,150 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.PrefixCodeEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.system.SystemTemplateMapper; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplate; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateService; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import com.casic.missiles.utils.ConvertUtils; +import com.casic.missiles.utils.NumberGeneratorUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateServiceImpl extends ServiceImpl implements ISystemTemplateService { + @Autowired + private SystemTemplateMapper templateMapper; + @Autowired + private ISystemTemplateUserRelationService userRelationService; + @Autowired + private SystemTemplateUserRelationMapper userRelationMapper; + + @Override + public Page listPage(Page page, TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + Page templatePage = templateMapper.selectPage(page, wrapper); + return templatePage; + } + + @Override + public List list(TemplateListRequest request) { + QueryWrapper wrapper = getWrapper(request); + return templateMapper.selectList(wrapper); + } + + @Override + public ReturnDTO templateDetail(Long id) { + TemplateDetailResponse templateDetailResponse = templateMapper.selectTemplateDetailById(id); + return ReturnUtil.success(templateDetailResponse); + } + + @Override + public ReturnDTO addTemplate(TemplateAddRequest request) { + //生成编号 + Long maxNo = templateMapper.selectMaxTemplateNo(); + String templateNo = NumberGeneratorUtil.getContactNo(PrefixCodeEnum.TEMPLATE_PREFIX, maxNo); //原始记录模板证书报告模板编号一起 + SystemTemplate systemTemplate = ConvertUtils.sourceToTarget(request, SystemTemplate.class); + systemTemplate.setTemplateNo(templateNo); + int insertFlag = templateMapper.insert(systemTemplate); + //关联表 + //0208原始记录模板和证书报告模板需求更新为都不需要可使用人 + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(request.getUserIdList())){ + List userRelationList = getUserRelations(request.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(insertFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("新建失败"); + + } + + @Override + public ReturnDTO updateTemplate(SystemTemplate systemTemplate) { + int updateFlag = templateMapper.updateById(systemTemplate); + //关联表 + int deleteFlag = 1; + boolean saveBatch = true; + if(!CollectionUtils.isEmpty(systemTemplate.getUserIdList())){ + Map columnMap = new HashMap<>(); + columnMap.put("template_id", systemTemplate.getId()); + deleteFlag = userRelationMapper.deleteByMap(columnMap); + List userRelationList = getUserRelations(systemTemplate.getUserIdList(), systemTemplate.getId()); + saveBatch = userRelationService.saveBatch(userRelationList); + } + if(updateFlag > 0 && deleteFlag > 0 && saveBatch){ + return ReturnUtil.success(); + } + return ReturnUtil.failed("更新失败"); + } + + @Override + public ReturnDTO deleteTemplate(Long id) { + if(templateMapper.deleteById(id) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + @Override + public ReturnDTO deleteBatchTemplate(List ids) { + if(templateMapper.deleteBatchIds(ids) > 0){ + return ReturnUtil.success(); + } + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + + private List getUserRelations(List userIdList, Long templateId) { + List bsRelations = new ArrayList<>(); + userIdList.forEach(id -> { + SystemTemplateUserRelation userRelation = new SystemTemplateUserRelation(); + userRelation.setTemplateId(templateId); + userRelation.setUserId(id); + bsRelations.add(userRelation); + }); + return bsRelations; + } + + private QueryWrapper getWrapper(TemplateListRequest request) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("system_type", request.getSystemType()); + wrapper.eq("template_type", request.getTemplateType()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateNo()), "template_no", request.getTemplateNo()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateName()), "template_name", request.getTemplateName()); + wrapper.like(StringUtils.isNotBlank(request.getTemplateCreator()), "template_creator", request.getTemplateCreator()); + wrapper.apply(StringUtils.isNotBlank(request.getCreateStartTime()), + "{0} <= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateStartTime().split(" ")[0]); + wrapper.apply(StringUtils.isNotBlank(request.getCreateEndTime()), + "{0} >= DATE_FORMAT(create_time,'%Y-%m-%d')", request.getCreateEndTime().split(" ")[0]); + wrapper.orderByDesc("create_time"); + return wrapper; + } +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java new file mode 100644 index 0000000..1957a87 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/SystemTemplateUserRelationServiceImpl.java @@ -0,0 +1,20 @@ +package com.casic.missiles.service.impl.system; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.system.SystemTemplateUserRelationMapper; +import com.casic.missiles.model.system.SystemTemplateUserRelation; +import com.casic.missiles.service.system.ISystemTemplateUserRelationService; +import org.springframework.stereotype.Service; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务实现类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +@Service +public class SystemTemplateUserRelationServiceImpl extends ServiceImpl implements ISystemTemplateUserRelationService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java new file mode 100644 index 0000000..7fb62c9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IDownloadCenterService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.DownloadFileRequest; +import com.casic.missiles.dto.system.DownloadListRequest; +import com.casic.missiles.dto.system.DownloadListResponse; +import com.casic.missiles.model.system.SystemFileConfig; + +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * 服务类 + *

+ * + * @author cz + * @since 2023-04-03 + */ +public interface IDownloadCenterService extends IService { + + Page listPage(Page page, DownloadListRequest request)throws Exception; + + void downloadFileExport(DownloadListRequest request, HttpServletResponse response) throws Exception; + + ReturnDTO addDownloadFile(SystemFileConfig downloadCenter); + + ReturnDTO updateDownloadFile(SystemFileConfig downloadCenter); + + SystemFileConfig downloadFileDetail(Long id); + + ReturnDTO deleteDownloadFile(Long id); + + ReturnDTO downloadFile(DownloadFileRequest downloadFileRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java new file mode 100644 index 0000000..acd6e07 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.system; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.FlowDeleteRequest; +import com.casic.missiles.dto.system.FlowListRequest; +import com.casic.missiles.dto.system.FlowProcDefDTO; +import com.casic.missiles.dto.system.FlowUpdateStateRequest; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/12/12 18:07 + */ +public interface IFlowDefService { + ReturnDTO jsonToBpmn(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + List listPage(Page page, FlowListRequest request); + + ReturnDTO update(JSONObject jsonObject) throws InvocationTargetException, IllegalAccessException; + + ReturnDTO detail(String formId); + + ReturnDTO updateState(FlowUpdateStateRequest request); + + ReturnDTO delete(FlowDeleteRequest request); + + List list(FlowListRequest request); + + List listByIds(List ids); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java new file mode 100644 index 0000000..87da2f1 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemFlowFormService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemFlowForm; + +/** + *

+ * 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-12 + */ +public interface ISystemFlowFormService extends IService { + + int getDirectorLevel(Long userId); + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java new file mode 100644 index 0000000..f1b2fed --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeService.java @@ -0,0 +1,30 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.NoticeAddRequest; +import com.casic.missiles.dto.system.NoticeListRequest; +import com.casic.missiles.dto.system.NoticeReadRequest; +import com.casic.missiles.model.system.SystemNotice; + +/** + *

+ * 系统管理-通知公告表 服务类 + *

+ * + * @author wangpeng + * @since 2022-11-29 + */ +public interface ISystemNoticeService extends IService { + + Page listPage(Page page, NoticeListRequest request); + + ReturnDTO addNotice(NoticeAddRequest noticeAddRequest); + + ReturnDTO updateNotice(SystemNotice systemNotice); + + ReturnDTO deleteNotice(Long id); + + ReturnDTO noticeRead(NoticeReadRequest noticeReadRequest); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java new file mode 100644 index 0000000..bdf3f2a --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemNoticeUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemNoticeUserRelation; + +/** + *

+ * 通知公告与用户关联表(记录已读) 服务类 + *

+ * + * @author wangpeng + * @since 2023-03-07 + */ +public interface ISystemNoticeUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java new file mode 100644 index 0000000..b5867a9 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignService.java @@ -0,0 +1,38 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.SignAddRequest; +import com.casic.missiles.dto.system.SignDetailResponse; +import com.casic.missiles.dto.system.SignListRequest; +import com.casic.missiles.model.system.SystemSign; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-签章/签名管理表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignService extends IService { + + Page listPage(Page page, SignListRequest request); + + ReturnDTO addSign(SignAddRequest request); + + ReturnDTO updateSign(SystemSign systemSign); + + ReturnDTO deleteSign(Long id); + + ReturnDTO deleteBatchSign(List ids); + + List usableSign(); + + List list(SignListRequest request); + + ReturnDTO signDetail(Long id); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java new file mode 100644 index 0000000..91aa01e --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemSignUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemSignUserRelation; + +/** + *

+ * 签章/签名与用户关联表(签章/签名可使用人) 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemSignUserRelationService extends IService { + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java new file mode 100644 index 0000000..01d93bf --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateService.java @@ -0,0 +1,36 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.system.TemplateAddRequest; +import com.casic.missiles.dto.system.TemplateDetailResponse; +import com.casic.missiles.dto.system.TemplateListRequest; +import com.casic.missiles.model.system.SystemTemplate; + +import java.util.List; + +/** + *

+ * 系统管理-常用工具-原始记录模板/证书报告模板表 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemTemplateService extends IService { + + Page listPage(Page page, TemplateListRequest request); + + ReturnDTO addTemplate(TemplateAddRequest request); + + ReturnDTO updateTemplate(SystemTemplate systemTemplate); + + ReturnDTO deleteTemplate(Long id); + + ReturnDTO deleteBatchTemplate(List ids); + + List list(TemplateListRequest request); + + ReturnDTO templateDetail(Long id); +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateUserRelationService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateUserRelationService.java new file mode 100644 index 0000000..07dbe23 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/ISystemTemplateUserRelationService.java @@ -0,0 +1,16 @@ +package com.casic.missiles.service.system; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.system.SystemTemplateUserRelation; + +/** + *

+ * 原始记录/证书报告模板与用户关联表(原始记录/证书报告模板可使用人) 服务类 + *

+ * + * @author wangpeng + * @since 2022-12-01 + */ +public interface ISystemTemplateUserRelationService extends IService { + +}